SpringBoot实现读写分离有两种方式
第一种是根据方法名,比如"select、get、query"开头的方法走从库,其余的走主库
第二种就是注解式,在方法上加上注解,里面指定走主库还是从库。
一、下面我先介绍第一种方式,直接上代码。
configure.properties
spring.datasource.server.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.server.username=root
spring.datasource.server.password=123456
spring.datasource.server.slave.url=jdbc:mysql://localhost:test-slave/?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.server.slave.username=root
spring.datasource.server.slave.password=123456
application.yml,master是主库,slave是从库
spring:
datasource:
master:
username: ${spring.datasource.server.username}
password: ${spring.datasource.server.password}
url: ${spring.datasource.server.url}
slave:
username: ${spring.datasource.server.slave.username}
password: ${spring.datasource.server.slave.password}
url: ${spring.datasource.server.slave.url}
1.DataSourceConfig数据源加载类
@Configuration
@MapperScan(basePackages = "com.aaa.bbb.mapper", sqlSessionTemplateRef = "sqlTemplateTest")
public class DataSourceConfig {
/**
* 主库
*/
@Bean(name="master")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource master() {
return DruidDataSourceBuilder.create().build();
}
/**
* 从库
*/
@Bean(name="slave")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slave() {
return DruidDataSourceBuilder.create().build();
}
/**
* 实例化数据源路由
*/
@Bean(name="dynamicDBTest")
public DataSourceRouter dynamicDBTest(@Qualifier("master") DataSource masterDataSource,
@Autowired(required = false) @Qualifier("slave") DataSource slaveDataSource) {
DataSourceRouter dynamicDataSource = new DataSourceRouter();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource);
if (slaveDataSource != null) {
targetDataSources.put("slave", slaveDataSource);
}
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}
/**
* 配置sessionFactory
*/
@Bean
public SqlSessionFactory sessionFactory(@Qualifier("dynamicDBTest") DataSource dynamicDataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:com/aa/bb/cc/mapper/**/*.xml"));
bean.setDataSource(dynamicDataSource);
return bean.getObject();
}
/**
* 创建sqlTemplate
*/
@Bean
public SqlSessionTemplate sqlTemplateTest(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
/**
* 事务配置
*/
@Bean(name = "dataSourceTx")
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dynamicDBTest") DataSource dynamicDataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dynamicDataSource);
return d

本文详细介绍使用SpringBoot实现数据库读写分离的两种方法:基于方法名前缀和基于注解的方式。通过具体代码示例展示了如何配置数据源、实现动态数据源切换,并通过事务拦截器确保事务的一致性。
最低0.47元/天 解锁文章
1157





