spring boot2多个数据源/mybatis/事务

spring boo1.x版本中,默认使用tomcat数据源,第二候选是hikari,虽然其性能更好,但是当时才刚刚出来需要时间的考验。而在spring boot2.x版本中,hikari终于荣升为默认数据源,已被包含在spring boot的jdbc依赖组件中。

参数配置

在properties中配置以下参数,前三个是通用配置,注意第四个参数maximumPoolSize有一个hikari前缀,代表hikari连接池的参数配置。更多参数及其详细说明可参考https://github.com/brettwooldridge/HikariCP

[plain] view plain copy
  1. spring.datasource.url=jdbc:mysql://localhost:3306/test  
  2. spring.datasource.username=root  
  3. spring.datasource.password=123456  
  4. spring.datasource.hikari.maximumPoolSize=100  

多个数据源

上面的参数是spring boot用于自动配置唯一数据源。有时候我们可能需要多个数据源,比如要让mybatis同时支持mysql和oracle,则需要手动配置数据源。

  • mysql参数:以下是我自定义的参数名,注意第一个参数,hikari只有jdbc-url而没有url。在spring boot自动配置时会将通用的url转换为hikari的jdbc-url,而手动配置时是无法被自动识别及转换的。
[plain] view plain copy
  1. mysql.jdbc-url=jdbc:mysql://localhost:3306/test  
  2. mysql.username=root  
  3. mysql.password=123456  
  4. mysql.maximum-pool-size=30  
  • oracle参数:配置同上。
[java] view plain copy
  1. oracle.jdbc-url=xxxxxxxxxxxxxxxxxxxxx  
  2. oracle.username=root  
  3. oracle.password=123456  
  4. oracle.maximum-pool-size=30  
  • mysql数据源:@Primary代表它是系统中默认的主数据源,其bean的id就是方法名mysqlDataSource。
[java] view plain copy
  1. @Bean  
  2. //默认数据源  
  3. @Primary  
  4. //将properties中以mysql为前缀的参数值,写入方法返回的对象中  
  5. @ConfigurationProperties(prefix="mysql")  
  6. public DataSource mysqDataSource() {  
  7.     //通过DataSourceBuilder构建数据源  
  8.     return DataSourceBuilder.create().type(HikariDataSource.class).build();  
  9. }  
  • oracle数据源:spring的@Autowired是按类型注入bean,由于上面已经配置了一个DataSource类型,现在要配置第二个同类型的bean,此时按类型注入时会引起混乱。这里使用@Qualifier定义一个名字,以区别于上面的主数据源。
[java] view plain copy
  1. @Bean  
  2. //副数据库需要配置@Qualifier  
  3. @Qualifier("oracle")  
  4. @ConfigurationProperties(prefix="oracle")  
  5. public DataSource oracleDataSource() {  
  6.     return DataSourceBuilder.create().type(HikariDataSource.class).build();  
  7. }  

多个mybatis配置

  • mysql配置:手动配置一个SqlSessionFactory,同时使用@Primary作为默认主SqlSessionFactory,通过@MapperScan指定dao目录,参考第8篇,这个目录的dao都会使用默认的主SqlSessionFactory。
[java] view plain copy
  1. @SpringBootConfiguration  
  2. @MapperScan(basePackages = "hello.dao.mysql")  
  3. public class MysqlConfig {  
  4.       
  5.     @Bean  
  6.     @Primary  
  7.     public SqlSessionFactory mysqlSessionFactory(DataSource mysqlDataSource) throws Exception {  
  8.         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();  
  9.         bean.setDataSource(mysqlDataSource);  
  10.         return bean.getObject();  
  • oracle配置:注意看两者的区别,参数多了@Qualifier("oracle")表示这个SqlSessionFactory使用的是oracle数据源,而上面没有指定@Qualifier则会使用默认的msql主数据源。这里同时指定了sqlSessionFactoryRef,其值oracleSessionFactory为SqlSessionFactory方法的方法名。同理,上面mysql也不需要配置这个
[java] view plain copy
  1. @SpringBootConfiguration  
  2. @MapperScan(basePackages = "hello.dao.oracle", sqlSessionFactoryRef = "oracleSessionFactory")  
  3. public class OracleConfig {  
  4.       
  5.     @Bean  
  6.     public SqlSessionFactory oracleSessionFactory(@Qualifier("oracle")DataSource oracleDataSource) throws Exception {  
  7.         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();  
  8.         bean.setDataSource(oracleDataSource);  
  9.         return bean.getObject();  
  10.     }  

多个事务

上面是mysql主事务管理,下面是oracle,配置原理和上面SqlSessionFactory一样,不多说了。
[java] view plain copy
  1. @Bean  
  2. @Primary  
  3. public PlatformTransactionManager mysqlTransactionManager(DataSource mysqlDataSource) {  
  4.     return new DataSourceTransactionManager(mysqlDataSource);  
  5. }  
[java] view plain copy
  1. @Bean  
  2. public PlatformTransactionManager oracleTransactionManager(@Qualifier("oracle")DataSource oracleDataSource) {  
  3.     return new DataSourceTransactionManager(oracleDataSource);  
  4. }  
第六篇结尾讲过事务用法,如下默认会使用mysql主事务
[java] view plain copy
  1. @Transactional  
如下指定使用oracle事务
[java] view plain copy
  1. @Transactional(transactionManager="oracleTransactionManager"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值