druid-1.2.6.pom 配置修改
<!--
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/openjdk-1.8-tools.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId>jconsole</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/openjdk-1.8-jconsole.jar</systemPath>
</dependency>
-->
改成
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8.0</version>
<scope>system</scope>
<systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId>jconsole</artifactId>
<version>1.8.0</version>
<scope>system</scope>
<systemPath>${env.JAVA_HOME}/lib/jconsole.jar</systemPath>
</dependency>
DataSourceAspect.java
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class DataSourceAspect {
@Before("@annotation(dsAnno)")
public void before(JoinPoint point, DSAnno dsAnno) {
System.out.println("数据源:" + dsAnno.value().getValue());
DataSourceContextHolder.setDB(dsAnno.value().getValue());
}
@After("@annotation(dsAnno)")
public void afterSwitchDS(JoinPoint point, DSAnno dsAnno) {
DataSourceContextHolder.clearDB();
}
}
DataSourceConfig.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DataSourceConfig {
//数据源1
@Bean(name = "test1")
@ConfigurationProperties(prefix = "spring.datasource.test1") // application.properteis中对应属性的前缀
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
//数据源2
@Bean(name = "test2")
@ConfigurationProperties(prefix = "spring.datasource.test2") // application.properteis中对应属性的前缀
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
//数据源2
@Bean(name = "test3")
@ConfigurationProperties(prefix = "spring.datasource.test3") // application.properteis中对应属性的前缀
public DataSource dataSource3() {
return DataSourceBuilder.create().build();
}
/**
* 动态数据源: 通过AOP在不同数据源之间动态切换
* @return
*/
@Primary
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDS = new DynamicDataSource();
// 默认数据源
// dynamicDataSource.setDefaultTargetDataSource(dataSource1());
// 配置多数据源
Map<Object, Object> dsMap = new HashMap();
dsMap.put("test1", dataSource1());
dsMap.put("test2", dataSource2());
dsMap.put("test3", dataSource3());
dynamicDS.setTargetDataSources(dsMap);
return dynamicDS;
}
/**
* 配置@Transactional注解事物
* @return
*/
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dynamicDataSource());
}
}
DataSourceContextHolder.java
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static final String DEFAULT_DS = DSEnum.DB1.getValue();
// 设置数据源名
public static void setDB(String dbType) {
contextHolder.set(dbType);
}
// 获取数据源名
public static String getDB() {
String dbsource = contextHolder.get();
if(dbsource == null ){
dbsource = "test1";
System.out.println("数据源为NULL 返回默认数据源"+ dbsource);
}
return dbsource;
}
// 清除数据源名
public static void clearDB() {
contextHolder.remove();
}
}
DSAnno.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface DSAnno {
DSEnum value();
}
DSEnum.java
public enum DSEnum {
DB1("test1"),
DB2("test2"),
DB3("test3");
private String value;
DSEnum(String value){
this.value=value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
DynamicDataSource.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
String dbsource = DataSourceContextHolder.getDB();
if(dbsource == null ){
dbsource = "test1";
logger.info("数据源为NULL 返回数据源"+DataSourceContextHolder.getDB());
}
return dbsource;
}
}
Springboot02Application.java
@SpringBootApplication
@MapperScan(basePackages = "com.example.demo.mapper")
public class Springboot02Application {
public static void main(String[] args) {
SpringApplication.run(Springboot02Application.class, args);
}
}
application.properties
在这里插入代码片#mysql
spring.datasource.test1.jdbc_url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.test2.jdbc_url=jdbc:mysql://localhost:3306/mybatis-plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driverClassName=com.mysql.cj.jdbc.Driver