Java实现多数据源的几种方式总结
作者:-半度
这篇文章主要给大家总结介绍了关于Java实现多数据源的几种方式,最近项目中的工作流需要查询多个数据源的数据,数据源可能是不同种类的,需要的朋友可以参考下
一、利用Spring提供的类实现
1)在yml文件当中配置多数据源
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource datasource1: url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false username: root password: root initial-size: 1 min-idle: 1 max-active: 20 test-on-borrow: true driver-class-name: com.mysql.cj.jdbc.Driver datasource2: url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false username: root password: root initial-size: 1 min-idle: 1 max-active: 20 test-on-borrow: true driver-class-name: com.mysql.cj.jdbc.Driver
2) 定义一个DataSourceConfig 配置类来配置两个数据源
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.datasource1") public DataSource dataSource1() { // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.datasource2") public DataSource dataSource2() { // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource return DruidDataSourceBuilder.create().build(); } /* @Bean public Interceptor dynamicDataSourcePlugin(){ return new DynamicDataSourcePlugin(); } */ @Bean public DataSourceTransactionManager transactionManager1(DynamicDataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } @Bean public DataSourceTransactionManager transactionManager2(DynamicDataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } }
3)自定义一个类 来 继承 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
** 在类里面注入分别注入两个数据源**
// 写 @Autowired DataSource dataSource1; // 读 @Autowired DataSource dataSource2; // 返回当前数据源标识 @Override protected Object determineCurrentLookupKey() { return name.get(); }
** 在这个类初始化完成之后,进行数据源的注入**
// 当前使用的数据源标识 public static ThreadLocal<String> name=new ThreadLocal<>(); @Override public void afterPropertiesSet() { // 为targetDataSources初始化所有数据源 Map<Object, Object> targetDataSources=new HashMap<>(); targetDataSources.put("W",dataSource1); targetDataSources.put("R",dataSource2); super.setTargetDataSources(targetDataSources); // 为defaultTargetDataSource 设置默认的数据源 super.setDefaultTargetDataSource(dataSource1); super.afterPropertiesSet(); }
**在service中使用指定的数据源 **
@Service public class FriendImplService implements FriendService { @Autowired FriendMapper friendMapper; @Override @WR("R") // 库2 public List<Friend> list() { // DynamicDataSource.name.set("R"); return friendMapper.list(); } @Override @WR("W") // 库1 public void save(Friend friend) { // DynamicDataSource.name.set("W"); friendMapper.save(friend); } }
上面采用注解的方式就是,其实是利用切面进行数据源的设置,和注释的注释方式类似
二、利用mybatis层次实现
1)分别配置两个配置源,单独配置
** 编写WMyBatisConfig配置文件**
@Configuration // 继承mybatis: // 1. 指定扫描的mapper接口包(主库) // 2. 指定使用sqlSessionFactory是哪个(主库) @MapperScan(basePackages = "com.datasource.dynamic.mybatis.mapper.w", sqlSessionFactoryRef="wSqlSessionFactory") public class WMyBatisConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.datasource1") public DataSource dataSource1() { // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource return DruidDataSourceBuilder.create().build(); } @Bean @Primary public SqlSessionFactory wSqlSessionFactory() throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); // 指定主库 sessionFactory.setDataSource(dataSource1()); // 指定主库对应的mapper.xml文件 /*sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/order/*.xml"));*/ return sessionFactory.getObject(); } @Bean @Primary public DataSourceTransactionManager wTransactionManager(){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource1()); return dataSourceTransactionManager; } @Bean public TransactionTemplate wTransactionTemplate(){ return new TransactionTemplate(wTransactionManager()); } }
** 编写RMyBatisConfig 配置文件**
@Configuration // 继承mybatis: // 1. 指定扫描的mapper接口包(主库) // 2. 指定使用sqlSessionFactory是哪个(主库) @MapperScan(basePackages = "com.tuling.datasource.dynamic.mybatis.mapper.w", sqlSessionFactoryRef="wSqlSessionFactory") public class WMyBatisConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.datasource1") public DataSource dataSource1() { // 底层会自动拿到spring.datasource中的配置, 创建一个DruidDataSource return DruidDataSourceBuilder.create().build(); } @Bean @Primary public SqlSessionFactory wSqlSessionFactory() throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); // 指定主库 sessionFactory.setDataSource(dataSource1()); // 指定主库对应的mapper.xml文件 /*sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/order/*.xml"));*/ return sessionFactory.getObject(); } @Bean @Primary public DataSourceTransactionManager wTransactionManager(){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource1()); return dataSourceTransactionManager; } @Bean public TransactionTemplate wTransactionTemplate(){ return new TransactionTemplate(wTransactionManager()); } }
2) 在serviceImpl实现层 单独调用配置的Mapper代理类
@Autowired private RFriendMapper rFriendMapper; @Autowired private WFriendMapper wFriendMapper; // 读-- 读库 @Override public List<Friend> list() { return rFriendMapper.list(); } // 保存-- 写库 @Override public void saveW(Friend friend) { friend.setName("loulan"); wFriendMapper.save(friend); } // 保存-- 读库 @Override public void saveR(Friend friend) { friend.setName("loulan"); rFriendMapper.save(friend); }
三、Spring自动化支持
1) 引入pom依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.0</version> </dependency>
2)在service层利用注解==@DS实现==
@Service public class FriendImplService implements FriendService { @Autowired FriendMapper friendMapper; @Override @DS("slave_1") // 从库, 如果按照下划线命名方式配置多个 , 可以指定前缀即可(组名) public List<Friend> list() { return friendMapper.list(); } @Override @DS("master") public void save(Friend friend) { friendMapper.save(friend); } @DS("master") @DSTransactional public void saveAll(){ // 执行多数据源的操作 } }
总结
到此这篇关于Java实现多数据源的几种方式的文章就介绍到这了,更多相关Java实现多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!