多数据源的配置
创建一个Spring配置类,定义两个DataSource用来读取application.yml中的不同配置。主数据源配置为YTS开头的配置,第二数据源配置为ALI开头的配置。
对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可,如下例子,在创建JdbcTemplate的时候分别注入名为primaryDataSource和secondaryDataSource的数据源来区分不同的JdbcTemplate。应用场景:项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库。
Spring的支持
对于数据源的配置可以沿用上例中DataSourceConfig的实现。
新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Repository定义位置,用@Primary区分主数据源。
1.配置文件
09 | driver- class -name: com.mysql.jdbc.Driver |
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; |
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; |
16 | import javax.sql.DataSource; |
20 | @MapperScan (basePackages = "com.daqsoft.pushdata.mapper.ali" , sqlSessionFactoryRef = "aliSqlSessionFactory" ) |
22 | public class ALIConfig { |
23 | @Bean (name = "aliDataSource" ) |
24 | @ConfigurationProperties (prefix = "datasource.ali" ) |
25 | public DataSource dataSource() { |
26 | return DataSourceBuilder.create().build(); |
29 | @Bean (name = "aliTransactionManager" ) |
30 | public DataSourceTransactionManager transactionManager( @Qualifier ( "aliDataSource" ) DataSource aliDataSource) { |
31 | return new DataSourceTransactionManager(aliDataSource); |
34 | @Bean (name = "aliSqlSessionFactory" ) |
35 | public SqlSessionFactory sqlSessionFactory( @Qualifier ( "aliDataSource" ) DataSource aliDataSource) throws Exception { |
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(); |
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; |
14 | import javax.sql.DataSource; |
18 | * springboot集成mybatis的基本入口 1)创建数据源(如果采用的是默认的tomcat-jdbc数据源,则不需要) |
19 | * 2)创建SqlSessionFactory 3)配置事务管理器,除非需要使用事务,否则不用配置 |
22 | @MapperScan (basePackages = "com.daqsoft.pushdata.mapper.yts" , sqlSessionFactoryRef = "ytsSqlSessionFactory" ) |
23 | public class YTSConfig { |
25 | @Bean (name = "ytsDataSource" ) |
26 | @ConfigurationProperties (prefix = "datasource.yts" ) |
27 | public DataSource dataSource() { |
28 | return DataSourceBuilder.create().build(); |
32 | @Bean (name = "ytsTransactionManager" ) |
33 | public DataSourceTransactionManager transactionManager( @Qualifier ( "ytsDataSource" ) DataSource ytsDataSource) { |
34 | return new DataSourceTransactionManager(ytsDataSource); |
38 | @Bean (name = "ytsSqlSessionFactory" ) |
39 | public SqlSessionFactory sqlSessionFactory( @Qualifier ( "ytsDataSource" ) DataSource ytsDataSource) throws Exception { |
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(); |
3)配置任务调度获取主数据源数据
01 | package com.daqsoft.pushdata.scheduled; |
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; |
17 | public class ScheduledTasks { |
19 | private PushDataService pushDataService; |
23 | * @Date: Created in 2017/4/27. |
27 | @Scheduled (fixedRate = 1000 * 60 * 5 ) |
28 | public void pushJQ_OTA_DATA() { |
29 | pushDataService.pushJQ_OTA_DATA(); |
4)到此,不同的数据源配置就已经完成,剩下的只需要将将Mybatis的xml文件和mapper层的接口写好,并在Service层注入,直接使用就行。
将两个数据源分别建立mapper层,
实现注入,再分别建立xml
至此,双数据源的配置完成,通过需要使用的数据源数据,获取需要的业务数据,实现业务数据的处理,实现双数据源的交互使用。上面的这种多数据源配置是不支持分布式事务的,也就是同一个事务中,不能操作多个数据库。这种配置方式的优点是很简单,但是却不灵活,需要依据业务场景来选择,如我当前的业务场景通过上述配置即可快速达成要求。