<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
@DS("slave")
public List<KeyValueVo> list(String areaCode) {
List<KeyValueVo> list = slaveMapper.list(areaCode);
return list;
}
dynamic:
primary: master
datasource:
master:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/master
username: root
password: 123456
slave:
url: jdbc:mysql://127.0.0.1:3306/slave
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
@DS("slave")
public List<KeyValueVo> list(String areaCode) {
List<KeyValueVo> list = slaveMapper.list(areaCode);
List<Dict> educationes = listDict("education");
...后续操作...
}
@DS("master")
public List<Dict> listDict(String dictType) {
List<Dict> list = dictMapper.list(dictType);
return list;
}
public List<Dict> listDict(String dictType) {
DynamicDataSourceContextHolder.push("master");
List<Dict> list = dictMapper.list(dictType);
DynamicDataSourceContextHolder.poll();
return list;
}
public DataSource determineDataSource() {
return this.getDataSource(DynamicDataSourceContextHolder.peek());
}
public DataSource getDataSource(String ds) {
if (StringUtils.isEmpty(ds)) {
return this.determinePrimaryDataSource();
} else if (!this.groupDataSources.isEmpty() && this.groupDataSources.containsKey(ds)) {
log.debug("dynamic-datasource switch to the datasource named [{}]", ds);
return ((DynamicGroupDataSource) this.groupDataSources.get(ds)).determineDataSource();
} else if (this.dataSourceMap.containsKey(ds)) {
log.debug("dynamic-datasource switch to the datasource named [{}]", ds);
return (DataSource) this.dataSourceMap.get(ds);
} else if (this.strict) {
throw new RuntimeException("dynamic-datasource could not find a datasource named" + ds);
} else {
return this.determinePrimaryDataSource();
}
}
private static final ThreadLocal<Deque<String>> LOOKUP_KEY_HOLDER = new ThreadLocal() {
protected Object initialValue() {
return new ArrayDeque();
}
};
private DynamicDataSourceContextHolder() {
}
public static String peek() {
return (String)((Deque)LOOKUP_KEY_HOLDER.get()).peek();
}
public static void push(String ds) {
((Deque)LOOKUP_KEY_HOLDER.get()).push(StringUtils.isEmpty(ds) ? "" : ds);
}
public static void poll() {
Deque<String> deque = (Deque)LOOKUP_KEY_HOLDER.get();
deque.poll();
if (deque.isEmpty()) {
LOOKUP_KEY_HOLDER.remove();
}
}
原文:https://www.cnblogs.com/drott/p/14596514.html