mysql数据原配置
mop文件
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
单数据源配置
-
yml文件
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1/t_student?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true port: 3306 username: root password: root
- javaBean配置
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource createMaster() { return DataSourceBuilder.create().build(); } @Bean public PaginationInterceptor paginationInterceptor() { //MybatisPlus分页配置加载 PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; } }
多数据源
-
yml文件
spring: datasource: master: name: master driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1/t_table?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true port: 3306 username: root password: root slave: name: slave driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://ip/dev_bailun_storm_data?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true port: 3306 username: root password: root
- javaBean配置
/** * 创建数据源bean */ @Configuration public class DataSourceConfig { private static final Logger log = LoggerFactory.getLogger(DataSourceConfig.class); public DataSourceConfig() { } @Bean({"master"}) @ConfigurationProperties( prefix = "spring.datasource.master" ) public DataSource createMaster() { log.info("【开始初始主库】"); return DataSourceBuilder.create().build(); } @Bean({"slave"}) @ConfigurationProperties( prefix = "spring.datasource.slave" ) public DataSource createSlave() { log.info("【开始初始从库】"); return DataSourceBuilder.create().build(); } } /** * 枚举类型,区分主从库 */ public enum DataSourceType { master, slave; private DataSourceType() { } } /** * 创建本地线程,初始化使用master */ public class DataSourceContextHolder { private static final ThreadLocal<Object> CONTEXT_HOLDER = ThreadLocal.withInitial(() -> { return DataSourceType.master; }); public DataSourceContextHolder() { } public static void setDataSourceKey(Object key) { CONTEXT_HOLDER.set(key); } public static Object getDataSourceKey() { return CONTEXT_HOLDER.get(); } public static void clearDataSourceKey() { CONTEXT_HOLDER.remove(); } } /** * 配置动态数据源切换 */ @Component @Primary public class RoutingDataSource extends AbstractRoutingDataSource { private static final Logger log = LoggerFactory.getLogger(RoutingDataSource.class); @Autowired @Qualifier("master") private DataSource master; @Autowired @Qualifier("slave") private DataSource slave; public RoutingDataSource() { } //决定使用哪个数据源 protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } //将映射配置到多数据源中 public void afterPropertiesSet() { Map<Object, Object> map = new HashMap(); map.put(DataSourceType.master, this.master); map.put(DataSourceType.slave, this.slave); this.setTargetDataSources(map); this.setDefaultTargetDataSource(this.master); super.afterPropertiesSet(); } } @Aspect @Component @Order(0) public class DataSourceAspect { private static final Logger log = LoggerFactory.getLogger(DataSourceAspect.class); //这里以select区分使用的数据源 private final String QUERY_PREFIX = "select"; public DataSourceAspect() { } //拦截方法,在方法之前执行;将数据源设置到本地线程中 @Before("execution( * com.fzz.club.*.mapper.*(..))") public void process(JoinPoint point) { Boolean isQueryMethod = this.isSelectMethod(point.getSignature().getName()); if (isQueryMethod) { DataSourceContextHolder.setDataSourceKey(DataSourceType.slave); } else { DataSourceContextHolder.setDataSourceKey(DataSourceType.master); } } private Boolean isSelectMethod(String methodName) { return methodName.startsWith("select") ? true : false; } }
主启动类
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan(basePackages = "com.bailun.storm.data.mapper")
public class BailunStormDataServiceApplication {
public static void main(String[] args) {
SpringApplication.run(BailunStormDataServiceApplication.class, args);
}
}