Spring Boot多數據源及其事務管理配置

Spring Boot多數據源及其事務管理配置

[TOC]html

準備工做

先給咱們的項目添加Spring-JDBC依賴和須要訪問數據庫的驅動依賴。java

配置文件

spring.datasource.prod.driverClassName=com.mysql.jdbc.Driver
spring.datasource.prod.url=jdbc:mysql://127.0.0.1:3306/prod
spring.datasource.prod.username=root
spring.datasource.prod.password=123456
 
spring.datasource.dev.driverClassName=com.mysql.jdbc.Driver
spring.datasource.dev.url=jdbc:mysql://127.0.0.1:3306/dev
spring.datasource.dev.username=root
spring.datasource.dev.password=123456

JavaConfig

首先創建Java配置類,爲其添加上註解@Configurationmysql

@Configuration
public class JdbcConfig {
 
}

配置數據源

  • 給其中一個數據源加上@Primary。由於在Spring Boot Jdbc的自動配置過程當中,會對於開發者透明地使用dataSource進行一些相關配置,因此當有兩個Datasource實現類時,Spring Boot將沒法肯定使用哪個。
  • 當咱們不爲@Bean指定名字時,Spring會默認使用方法名做爲Bean的名字,因此下面兩個數據源的名字分別爲prodDataSourcedevDataSource
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.prod")
public DataSource prodDataSource(){
    return DataSourceBuilder.create().build();
}
 
@Bean
@ConfigurationProperties(prefix = "spring.datasource.dev")
public DataSource devDataSource(){
    return DataSourceBuilder.create().build();
}

配置文件裏的屬性名是不須要寫成spring.datasource.xxx的形式的,寫成a.b.c.url也沒有問題,只要在配置bean時指定前綴爲a.b.cspring

配置JdbcTemplate

  • 在此咱們返回的不是JdbcTemplate的實現,而是其實現接口JdbcOperations
  • 使用@Qualifier註解指定該注入哪一個bean,默認名字爲定義該bean的方法名。
@Bean
public JdbcOperations prodJdbcOperations(@Qualifier("prodDataSource") DataSource prodDataSource) {
    return new JdbcTemplate(prodDataSource);
}
 
@Bean
public JdbcOperations devJdbcOperations(@Qualifier("devDataSource") DataSource devDataSource) {
    return new JdbcTemplate(devDataSource);
}

使用

  • 直接注入JdbcOperations便可
@Autowired
    private JdbcOperations devJdbcOperations;
 
    @Autowired
    private JdbcOperations prodJdbcOperations;

事務配置

開啓事務管理功能

在項目入口類,添加如下註解開啓事務管理功能。sql

@EnableTransactionManagement

配置事務管理器

@Bean
public PlatformTransactionManager prodTransactionManager(@Qualifier("prodDataSource") DataSource prodDataSource) {
    return new DataSourceTransactionManager(prodDataSource);
}
 
@Bean
public PlatformTransactionManager devTransactionManager(@Qualifier("devDataSource") DataSource sitDataSource) {
    return new DataSourceTransactionManager(sitDataSource);
}

使用

使用時只需在須要事務的方法添加註解@Transactional,並指定其value值便可。一樣的,value值與相應的方法名相匹配便可。數據庫

@Transactional(value = "prodTransactionManager")
public void prod() {
    prodJdbcOperations.queryForList("SELECT * FROM USER");
}
 
@Transactional(value = "devTransactionManager")
public void dev() {
    devJdbcOperations.queryForList("SELECT * FROM USER");
}

注意,@Transactional配置事務有不少限制,如方法必須爲public,同一個類中無該註解的方法調用有註解的方法事務不生效等。該註解還能夠配置在接口類等地方,具體用法請參考Spring官方文檔相應章節 http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.htmlui

相關文章
相關標籤/搜索