现成工具介绍
MyCat
活跃的、性能好的开源数据库中间件。它是一个透明化的数据库代理端,在生产环境使用需要保证服务的高可用。
ShardingSphere
ShardingSphere由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。其中ShardingSphere-Proxy与MyCat是相同的定位,而ShardingSphere-JDBC在 Java 的 JDBC 层提供的额外服务。
SpringBoot集成ShardingSphere-JDBC也非常方便,引入包,编写好配置文档就可立即使用。但在事务中有一点点问题,就是在事务中有写操作后,以后的读操作才都从主库读取;也就是说在写操作前,事务里的读还是从从库里读的,这可能会造成脏写。
使用Mybatis拦截器
代码层面的读写分离大部分都是拦截sql, 通过判断sql的读写类型来重定向数据库的,ShardingSphere-JDBC也不例外。
Mybatis允许我们自定义拦截器,需要实现Interceptor接口,并且在自定义拦截器类上添加@Intercepts注解。在@Intercepts注解中,我们可以指定拦截的方法。
开干
多数据源
既然是在代码层面进行读写分离,那肯定是有读&写两个库了,这里就用到了多数据源功能,这里没有用Mybatis/Mybatis-Plus默认的多数据源的生成方式,而是自己配置了多数据源,其实也可以用默认生成的方式,自己写一遍的目的是为了更加了解里面的原理。[配置文件里配置的格式就照Mybatis-Plus多数据源配置的格式配]
代码
多数据源配置
/**
* 数据库主库
*/
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.master")
public DataSource masterDataSource(){
log.info("加载主数据源master DataSource.");
return DruidDataSourceBuilder.create().build();
}
/**
* 数据库从库
*/
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.slave1")
public DataSource slave1DataSource(){
log.info("加载从数据源slave1 DataSource.");
return DruidDataSourceBuilder.create().build();
}
/**
* 动态数据源
*/
@Bean
public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slave1DataSource") DataSource slave1DataSource) {
log.info("加载[masterDataSource-