springBoot多資料來源配置以及事務控制
阿新 • • 發佈:2019-01-31
一:多資料來源配置
1、主資料來源配置檔案
package com.bert.datasource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.github.pagehelper.PageInterceptor; import java.util.Properties; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.bert.mapper.master1", sqlSessionTemplateRef = "master1SqlSessionTemplate") public class DataSource1Config { @Bean(name = "master1DataSource") @ConfigurationProperties(prefix = "master1.datasource") @Primary public DataSource master1DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "master1SqlSessionFactory") @Primary public SqlSessionFactory master1SqlSessionFactory(@Qualifier("master1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master1/*.xml")); // 分頁攔截器-begin PageInterceptor pageHelper = new PageInterceptor(); Properties properties = new Properties(); properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect"); properties.setProperty("offsetAsPageNum", "true"); properties.setProperty("rowBoundsWithCount", "false"); properties.setProperty("reasonable", "false"); pageHelper.setProperties(properties); bean.getObject().getConfiguration().addInterceptor(pageHelper); return bean.getObject(); } @Bean(name = "master1TransactionManager") @Primary public DataSourceTransactionManager master1TransactionManager(@Qualifier("master1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "master1SqlSessionTemplate") @Primary public SqlSessionTemplate master1SqlSessionTemplate( @Qualifier("master1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
2、其他資料來源配置檔案
package com.bert.datasource; import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.github.pagehelper.PageInterceptor; @Configuration @MapperScan(basePackages = "com.bert.mapper.master2", sqlSessionTemplateRef = "master2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "master2DataSource") @ConfigurationProperties(prefix = "master2.datasource") public DataSource master2DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "master2SqlSessionFactory") public SqlSessionFactory master2SqlSessionFactory(@Qualifier("master2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master2/*.xml")); // 分頁攔截器-begin PageInterceptor pageHelper = new PageInterceptor(); Properties properties = new Properties(); properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect"); properties.setProperty("offsetAsPageNum", "true"); properties.setProperty("rowBoundsWithCount", "false"); properties.setProperty("reasonable", "false"); pageHelper.setProperties(properties); bean.getObject().getConfiguration().addInterceptor(pageHelper); return bean.getObject(); } @Bean(name = "master2TransactionManager") public DataSourceTransactionManager master2TransactionManager(@Qualifier("master2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "master2SqlSessionTemplate") public SqlSessionTemplate master2SqlSessionTemplate( @Qualifier("master2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
注意:
A:只能有一個主資料來源,用註解@Primary表示
B:@MapperScan屬性basePackages,表示資料來源對應的mapper檔案目錄
3、springBoot配置檔案
master1.datasource.url=jdbc:sqlserver://ip1:1433; DatabaseName=db1 master1.datasource.username=xx master1.datasource.password=xxxxxx master1.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver master2.datasource.url=jdbc:sqlserver://ip2:1433; DatabaseName=db2 master2.datasource.username=xx master3.datasource.password=xxxxxx master2.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
二:多資料來源事務控制
1、啟動檔案,配置事務註解@EnableTransactionManagement
@Controller
@SpringBootApplication
@EnableSwagger2
@EnableTransactionManagement
public class BootMain extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BootMain.class);
}
public static void main(String[] args) {
SpringApplication.run(BootMain.class, args);
}
}
2、介面實現配置事務註解@Transactional
如果是單一資料來源,只需要在service實現的方法上加上@Transactional即可。
如果是多資料來源,需要指定事務管理器名稱
@Transactional(value = "master2TransactionManager", rollbackFor = { Exception.class })
我在微信訂閱號等你!