spring boot2 (26)-hikari、多个数据源/mybatis/事务

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

参数配置

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

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.hikari.maximumPoolSize=100

多个数据源

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

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

多个mybatis配置

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

多个事务

上面是mysql主事务管理,下面是oracle,配置原理和上面SqlSessionFactory一样,不多说了。
	@Bean
	@Primary
	public PlatformTransactionManager mysqlTransactionManager(DataSource mysqlDataSource) {
		return new DataSourceTransactionManager(mysqlDataSource);
	}
	@Bean
	public PlatformTransactionManager oracleTransactionManager(@Qualifier("oracle")DataSource oracleDataSource) {
		return new DataSourceTransactionManager(oracleDataSource);
	}
第六篇结尾讲过事务用法,如下默认会使用mysql主事务
@Transactional
如下指定使用oracle事务
@Transactional(transactionManager="oracleTransactionManager")

猜你喜欢

转载自blog.csdn.net/wangb_java/article/details/79938242