版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wu6660563/article/details/78795867
多数据源配置
多数据源配置,可以参考翟永超的博客http://blog.didispace.com/springbootmultidatasource/
本人前期摸索学习也是参考他的这个博客地址学习的
本人侧重点是讲解多数据源事务
多数据源事务有几种方式
1. 指定事务管理器,每个Service只有允许一个事务管理器
2. 根据Service中的数据源,自动切换事务管理器
3. 多数据源跨库真正意义的事务
多数据源配置+事务
application.properties
配置多个数据源
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver
spring.datasource.primary.url=jdbc:mysql://localhost:3306/world
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/nick_test
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.third.driverClassName=com.mysql.jdbc.Driver
spring.datasource.third.url=jdbc:mysql://localhost:3306/world
spring.datasource.third.username=root
spring.datasource.third.password=root
spring.datasource.type=org.apache.tomcat.jdbc.pool.XADataSource
Properties实体
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.primary")
public class PrimaryDataSourceProperties {
private String driverClassName;
private String url;
private String userName;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public class SecondaryDataSourceProperties {
private String driverClassName;
private String url;
private String userName;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.third")
public class ThirdDataSourceProperties {
private String driverClassName;
private String url;
private String userName;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注入DataSource
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
private static Logger logger = Logger.getLogger(DataSourceConfig.class);
@Autowired
private PrimaryDataSourceProperties primaryDataSourceProperties;
@Autowired
private SecondaryDataSourceProperties secondaryDataSourceProperties;
@Autowired
private ThirdDataSourceProperties thirdDataSourceProperties;
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@Primary
public DataSource primaryDataSource() {
logger.info(primaryDataSourceProperties.getDriverClassName() + "------------" + primaryDataSourceProperties.getUrl());
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(primaryDataSourceProperties.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setUser(primaryDataSourceProperties.getUserName());
mysqlXaDataSource.setPassword(primaryDataSourceProperties.getPassword());
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("primaryDataSource");
return xaDataSource;
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
public DataSource secondaryDataSource() {
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(secondaryDataSourceProperties.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setUser(secondaryDataSourceProperties.getUserName());
mysqlXaDataSource.setPassword(secondaryDataSourceProperties.getPassword());
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("secondaryDataSource");
return xaDataSource;
}
@Bean(name = "thirdDataSource")
@Qualifier("thirdDataSource")
public DataSource thirdDataSource() {
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(thirdDataSourceProperties.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setUser(thirdDataSourceProperties.getUserName());
mysqlXaDataSource.setPassword(thirdDataSourceProperties.getPassword());
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("thirdDataSource");
return xaDataSource;
}
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "thirdJdbcTemplate")
public JdbcTemplate thirdJdbcTemplate(
@Qualifier("thirdDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
//分布式事务配置,配置JTA事务
@Bean(name = "userTransaction")
public UserTransaction userTransaction() throws Throwable {
UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(10000);
return userTransactionImp;
}
@Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
public TransactionManager atomikosTransactionManager() throws Throwable {
UserTransactionManager userTransactionManager = new UserTransactionManager();
userTransactionManager.setForceShutdown(false);
return userTransactionManager;
}
@Bean(name = "transactionManager")
@DependsOn({ "userTransaction", "atomikosTransactionManager" })
public PlatformTransactionManager transactionManager() throws Throwable {
UserTransaction userTransaction = userTransaction();
JtaTransactionManager manager = new JtaTransactionManager(userTransaction,atomikosTransactionManager());
return manager;
}
}
Service
@Service
public class TestServiceImpl implements TestService {
@Autowired
private JdbcTemplate primaryJdbcTemplate;
@Autowired
private JdbcTemplate secondaryJdbcTemplate;
@Transactional(rollbackFor = Exception.class)
@Override
public void test() {
primaryJdbcTemplate.execute("INSERT INTO test_city(province_id, city_name, description) VALUES('364', '九江市', '九江市')");
secondaryJdbcTemplate.execute("INSERT INTO tb_account_one VALUES('1004', 10000.00, 0.00)");
System.out.println(100 / 0);//测试回滚,统一提交的话,将这行注释掉就行了
}
}
如果是Oracle和Sqlserver的话,Oracle可以使用OracleXADataSource
,Mysql使用MysqlXADataSource