基于spring boot项目的多数据源配置

多数据源的配置

        创建一个Spring配置类,定义两个DataSource用来读取application.yml中的不同配置。主数据源配置为YTS开头的配置,第二数据源配置为ALI开头的配置。

对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可,如下例子,在创建JdbcTemplate的时候分别注入名为primaryDataSourcesecondaryDataSource的数据源来区分不同的JdbcTemplate。景:项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库。

Spring的支持

对于数据源的配置可以沿用上例中DataSourceConfig的实现。

新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Repository定义位置,用@Primary区分主数据源。

1.配置文件




01 server:
02   port: 8888
03 datasource:
04   yts:
05     name: yts
06     url: jdbc:mysql://***************/scenic_db?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false
07     username: user
08     password: password
09     driver-class-name: com.mysql.jdbc.Driver
10   ali:
11     name: ali
12     url: jdbc:mysql://***************/scenic_test?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false
13     username: user
14     password: password
15     driver-class-name: com.mysql.jdbc.Driver




配置数据源

给其中一个数据源加上@Primary。因为在Spring Boot Jdbc的自动配置过程中,会对于开发者透明地使用dataSource进行一些相关配置,所以当有两个Datasource实现类时,Spring Boot将无法确定使用哪一个。
当我们不为@Bean指定名字时,Spring会默认使用方法名作为Bean的名字,所以下面两个数据源的名字分别为aliDataSource和ytsDataSource。

1)aliConfig:




01 package com.daqsoft.pushdata.config;
02  
03  
04 import org.apache.ibatis.session.SqlSessionFactory;
05 import org.mybatis.spring.SqlSessionFactoryBean;
06 import org.mybatis.spring.annotation.MapperScan;
07 import org.springframework.beans.factory.annotation.Qualifier;
08 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
09 import org.springframework.boot.context.properties.ConfigurationProperties;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
13 import org.springframework.core.io.support.ResourcePatternResolver;
14 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
15  
16 import javax.sql.DataSource;
17  
18  
19 @Configuration
20 @MapperScan(basePackages = "com.daqsoft.pushdata.mapper.ali", sqlSessionFactoryRef = "aliSqlSessionFactory")
21  
22 public class ALIConfig {
23     @Bean(name = "aliDataSource")
24     @ConfigurationProperties(prefix = "datasource.ali")
25     public DataSource dataSource() {
26         return DataSourceBuilder.create().build();
27     }
28  
29     @Bean(name = "aliTransactionManager")
30     publicDataSourceTransactionManager transactionManager(@Qualifier("aliDataSource") DataSource aliDataSource) {
31         return new DataSourceTransactionManager(aliDataSource);
32     }
33  
34     @Bean(name = "aliSqlSessionFactory")
35     publicSqlSessionFactory sqlSessionFactory(@Qualifier("aliDataSource") DataSource aliDataSource) throwsException {
36         SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
37         factoryBean.setDataSource(aliDataSource);
38         ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
39         factoryBean.setMapperLocations(resolver.getResources("classpath:/ali/mapper/*.xml"));
40         factoryBean.setTypeAliasesPackage("com.daqsoft.pushdata.model");
41         return factoryBean.getObject();
42     }
43  
44 }

         2)ytsConfig(springboot集成mybatis的基本入口 1)创建数据源(如果采用的是默认的tomcat-jdbc数据源,则不需要))







1 package com.daqsoft.pushdata.config;
01 import org.apache.ibatis.session.SqlSessionFactory;
02 import org.mybatis.spring.SqlSessionFactoryBean;
03 import org.mybatis.spring.annotation.MapperScan;
04 import org.springframework.beans.factory.annotation.Qualifier;
05 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
06 import org.springframework.boot.context.properties.ConfigurationProperties;
07 import org.springframework.context.annotation.Bean;
08 import org.springframework.context.annotation.Configuration;
09 import org.springframework.context.annotation.Primary;
10 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
11 import org.springframework.core.io.support.ResourcePatternResolver;
12 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
13  
14 import javax.sql.DataSource;
15  
16  
17 /**
18  * springboot集成mybatis的基本入口 1)创建数据源(如果采用的是默认的tomcat-jdbc数据源,则不需要)
19  * 2)创建SqlSessionFactory 3)配置事务管理器,除非需要使用事务,否则不用配置
20  */
21 @Configuration // 该注解类似于spring配置文件
22 @MapperScan(basePackages = "com.daqsoft.pushdata.mapper.yts", sqlSessionFactoryRef = "ytsSqlSessionFactory")
23 public class YTSConfig {
24     @Primary
25     @Bean(name = "ytsDataSource")
26     @ConfigurationProperties(prefix = "datasource.yts")
27     public DataSource dataSource() {
28         return DataSourceBuilder.create().build();
29     }
30  
31     @Primary
32     @Bean(name = "ytsTransactionManager")
33     publicDataSourceTransactionManager transactionManager(@Qualifier("ytsDataSource") DataSource ytsDataSource) {
34         return new DataSourceTransactionManager(ytsDataSource);
35     }
36  
37     @Primary
38     @Bean(name = "ytsSqlSessionFactory")
39     publicSqlSessionFactory sqlSessionFactory(@Qualifier("ytsDataSource") DataSource ytsDataSource) throwsException {
40         SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
41         factoryBean.setDataSource(ytsDataSource);
42         ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
43         factoryBean.setTypeAliasesPackage("com.daqsoft.pushdata.model");
44         factoryBean.setMapperLocations(resolver.getResources("classpath:/yts/mapper/*.xml"));
45         return factoryBean.getObject();
46     }
47  
48 }



3)配置任务调度获取主数据源数据



01 package com.daqsoft.pushdata.scheduled;
02  
03 import com.daqsoft.pushdata.service.PushDataService;
04 import org.springframework.beans.factory.annotation.Autowired;
05 import org.springframework.beans.factory.annotation.Configurable;
06 import org.springframework.scheduling.annotation.EnableScheduling;
07 import org.springframework.scheduling.annotation.Scheduled;
08 import org.springframework.stereotype.Component;
09  
10 /**
11  * 任务调度
12  */
13  
14 @Component
15 @Configurable
16 @EnableScheduling
17 public class ScheduledTasks {
18     @Autowired
19     private PushDataService pushDataService;
20  
21     /**
22      * @Author: ziy .
23      * @Date: Created in 2017/4/27.
24      * @Version: 主数据推送数据
25      * @describe:ota票务
26      */
27     @Scheduled(fixedRate = 1000 60 5)
28     public void pushJQ_OTA_DATA() {
29         pushDataService.pushJQ_OTA_DATA();
30 }
31     }


4)到此,不同的数据源配置就已经完成,剩下的只需要将将Mybatis的xml文件和mapper层的接口写好,并在Service层注入,直接使用就行。

将两个数据源分别建立mapper层,

实现注入,再分别xml



至此,双数据源的配置完成,通过需要使用的数据源数据,获取需要的业务数据,实现业务数据的处理,实现双数据源的交互使用。上面的这种多数据源配置是不支持分布式事务的,也就是同一个事务中,不能操作多个数据库。这种配置方式的优点是很简单,但是却不灵活,需要依据业务场景来选择,如我当前的业务场景通过上述配置即可快速达成要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值