天天看點

spring boot2 (26)-hikari、多個資料源/mybatis/事務參數配置多個資料源多個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")
           

繼續閱讀