springBoot多數據源事務管理


一、屬性文件配置多數據源

#社區
spring.datasource.commonunity.driver-class-name=org.postgresql.Driver
spring.datasource.commonunity.url=jdbc:postgresql://**:5432/test_**
spring.datasource.commonunity.username=postgres
spring.datasource.commonunity.password=postgres

#flyway
spring.datasource.flyway.driver-class-name=org.postgresql.Driver
spring.datasource.flyway.url=jdbc:postgresql://**:5432/test_**
spring.datasource.flyway.username=postgres
spring.datasource.flyway.password=postgres

二、創建Datasource Bean

@Bean:是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。添加的bean的id為方法名

@Primary:指定在同一個接口有多個實現類可以注入的時候,默認選擇哪一個,而不是讓@Autowire注解報錯(一般用於多數據源的情況下)

@Qualifier:指定名稱的注入,當一個接口有多個實現類的時候使用

@SpringBootConfiguration
public class DataSourceConfig {

	@Bean
	@Primary
	@ConfigurationProperties(prefix = "spring.datasource.commonunity")
	public DataSource commonunityDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.flyway")
	public DataSource flywayDataSource() {
		return DataSourceBuilder.create().build();
	}

} 

三、創建DataSourceTransactionManager、SqlSessionFactory、SqlSessionTemplate   Bean

SqlSessionFactory:是MyBatis的關鍵對象,它是個單個數據庫映射關系經過編譯后的內存鏡像.SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象類獲得,而SqlSessionFactoryBuilder則可以從XML配置文件或一個預先定制的Configuration的實例構建出SqlSessionFactory的實例.每一個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心.同時SqlSessionFactory也是線程安全的,SqlSessionFactory一旦被創建,應該在應用執行期間都存在.在應用運行期間不要重復創建多次,建議使用單例模式.SqlSessionFactory是創建SqlSession的工廠

SqlSessionTemplate:是MyBatis-Spring的核心。這個類負責管理MyBatis的SqlSession,調用MyBatis的SQL方法,翻譯異常。SqlSessionTemplate是線程安全的,可以被多個DAO所共享使用。
當調用SQL方法時,包含從映射器getMapper()方法返回的方法,SqlSessionTemplate將會保證使用的SqlSession是和當前Spring的事務相關的。此外,它管理session的生命周期,包含必要的關閉,提交或回滾操作。
SqlSessionTemplate實現了SqlSession,這就是說要對MyBatis的SqlSession進行簡易替換。SqlSessionTemplate對象可以使用SqlSessionFactory作為構造方法的參數來創建

@SpringBootConfiguration     
@MapperScan(basePackages = {"com.ryj.test.multipleDataSource.dao.commonunity"},sqlSessionFactoryRef = "sqlSessionFactoryCommonunity" )
public class MybatisCommonunityConfig {

    @Autowired
    @Qualifier("commonunityDataSource")
    private DataSource commonunityDataSource;

    @Bean
    public DataSourceTransactionManager transactionManagerCommonunity() {
        return new DataSourceTransactionManager(commonunityDataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryCommonunity() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/commonunity/*.xml"));
        sessionFactory.setDataSource(commonunityDataSource);
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateCommonunity() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryCommonunity()); // 使用上面配置的Factory
        return template;
    }
}
@SpringBootConfiguration
@MapperScan(basePackages = {"com.ryj.test.multipleDataSource.dao.flyway"},sqlSessionFactoryRef = "sqlSessionFactoryFlyway")
public class MybatisFlywayConfig {

    @Autowired
    @Qualifier("flywayDataSource")
    private DataSource flywayDataSource;

    @Bean
    public DataSourceTransactionManager transactionManagerFlyway() {
        return new DataSourceTransactionManager(flywayDataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryFlyway() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/flyway/*.xml"));
        sessionFactory.setDataSource(flywayDataSource);
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateFlyway() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryFlyway()); // 使用上面配置的Factory
        return template;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM