首页>代码>springboot2 aop注解配置多个数据库并实现多数据源动态切换和数据库读写分离>/read-write-splitting/src/main/java/cn/jsxwsl/www/config/datasource/MutiDataSource.java
package cn.jsxwsl.www.config.datasource; import cn.jsxwsl.www.nums.DBTypeEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; 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.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import org.springframework.lang.Nullable; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** * @Author 佚名 * @Date 2020/3/25 18:26 */ @Configuration @EnableTransactionManagement public class MutiDataSource { /** * Spring boot提供了AbstractRoutingDataSource * 根据用户定义的规则选择当前的数据源, * 这样我们可以在执行查询之前,设置使用的数据源。 * 实现可动态路由的数据源,在每次数据库查询操作前执行。 * 它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。 */ static class MyRoutingDataSource extends AbstractRoutingDataSource { @Nullable @Override protected Object determineCurrentLookupKey() { // 从当前线程获取到数据源的key return DataSourceTheadLocal.get(); } } /** * 数据源 master * * @return DataSource */ @Bean @ConfigurationProperties("spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } /** * 数据源 slave1 * * @return DataSource */ @Bean @ConfigurationProperties("spring.datasource.slave1") public DataSource slave1DataSource() { return DataSourceBuilder.create().build(); } /** * 数据源 slave2 * * @return DataSource */ @Bean @ConfigurationProperties("spring.datasource.slave2") public DataSource slave2DataSource() { return DataSourceBuilder.create().build(); } @Bean public DataSource myRoutingDataSource(DataSource masterDataSource, DataSource slave1DataSource, DataSource slave2DataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DBTypeEnum.MASTER, masterDataSource); targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource); targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource); MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource(); myRoutingDataSource.setDefaultTargetDataSource(masterDataSource); myRoutingDataSource.setTargetDataSources(targetDataSources); return myRoutingDataSource; } /** * 配置事务 * * @param myRoutingDataSource DataSource * @return PlatformTransactionManager */ @Bean public PlatformTransactionManager transactionManager(DataSource myRoutingDataSource) { return new DataSourceTransactionManager(myRoutingDataSource); } /** * mybatis * @param myRoutingDataSource DataSource * @return SqlSessionFactory * @throws Exception Exception */ @Bean public SqlSessionFactory sqlSessionFactory(DataSource myRoutingDataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(myRoutingDataSource); // sqlSessionFactoryBean.setMapperLocations( // new PathMatchingResourcePatternResolver() // .getResources("classpath:mapper/*.xml") // ); return sqlSessionFactoryBean.getObject(); } }

lironggang LV38
2023年7月11日
HANCW LV9
2023年3月12日
1529860026 LV24
2022年10月18日
1234mama LV19
2022年4月11日
fellowfun LV12
2021年8月12日
mudingc木钉 LV30
2021年6月16日
annazhang LV29
2021年6月11日
pxqtsht LV16
2021年5月16日
xhmpmail LV17
2021年2月22日
听说过 LV17
2021年1月4日

1358849392 LV21
2024年1月22日
漫步的海星 LV4
2023年9月21日
lironggang LV38
2023年7月11日
HANCW LV9
2023年3月12日
xiahaoyu LV8
2023年2月25日
xp95323 LV15
2022年9月21日
绘飛的渔
2022年8月2日
暂无贡献等级
fangen0005 LV25
2022年4月17日
zhang6332
2022年4月6日
暂无贡献等级
1214066599 LV8
2022年4月4日