From 81c249e1244c0b6aa0897f71da55b005a79b6ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Sun, 27 Jan 2019 10:25:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20spring=20boot=20=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E7=94=A8=E4=BE=8B=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=88=86=E5=B8=83=E5=BC=8F=E4=BA=8B=E5=8A=A1=EF=BC=88?= =?UTF-8?q?JTA=E6=96=B9=E5=BC=8F=E5=AE=9E=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springboot/config/DataSourceFactory.java | 40 +++++-------------- .../springboot/config/DynamicDataSource.java | 17 -------- .../controller/TransactionController.java | 4 +- .../controller/XATransactionController.java | 8 ++-- .../src/main/resources/sql/programmer.sql | 8 ++++ .../springboot-druid-mybatis-multi/tmlog.lck | 0 .../tmlog124.log | 3 -- 7 files changed, 24 insertions(+), 56 deletions(-) delete mode 100644 spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DynamicDataSource.java create mode 100644 spring-boot/springboot-druid-mybatis-multi/src/main/resources/sql/programmer.sql delete mode 100644 spring-boot/springboot-druid-mybatis-multi/tmlog.lck delete mode 100644 spring-boot/springboot-druid-mybatis-multi/tmlog124.log diff --git a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DataSourceFactory.java b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DataSourceFactory.java index 9c64581..43f7881 100644 --- a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DataSourceFactory.java +++ b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DataSourceFactory.java @@ -10,7 +10,6 @@ import org.mybatis.spring.annotation.MapperScan; 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 javax.sql.DataSource; @@ -20,8 +19,6 @@ import java.util.Map; /** * @author : heibaiying * @description : 多数据源配置 - * 需要特别强调的是以下任意的DataSource的bean都不要用@Primary去修饰,包括动态数据源。原因是在事务下,spring在DataSourceUtils类中doGetConnection方法中判断获取当前数据源是否持有连接的时候, - * 总是会传入用@Primary修饰的数据源,如果一个事务下有多个数据源,这种情况下就会出现connection复用,无法切换数据源, 详见README.md */ @Configuration @MapperScan(basePackages = DataSourceFactory.BASE_PACKAGES, sqlSessionTemplateRef = "sqlSessionTemplate") @@ -33,11 +30,11 @@ public class DataSourceFactory { /*** - * 创建 DruidXADataSource 1 + * 创建 DruidXADataSource 1 用@ConfigurationProperties自动配置属性 */ @Bean @ConfigurationProperties("spring.datasource.druid.db1") - public DataSource DruidDataSourceOne() { + public DataSource druidDataSourceOne() { return new DruidXADataSource(); } @@ -46,51 +43,34 @@ public class DataSourceFactory { */ @Bean @ConfigurationProperties("spring.datasource.druid.db2") - public DataSource DruidDataSourceTwo() { + public DataSource druidDataSourceTwo() { return new DruidXADataSource(); } /** - * 创建支持XA事务的Atomikos数据源1,不要用@Primary去修饰 + * 创建支持XA事务的Atomikos数据源1 */ @Bean - public DataSource dataSourceOne(DataSource DruidDataSourceOne) { + public DataSource dataSourceOne(DataSource druidDataSourceOne) { AtomikosDataSourceBean sourceBean = new AtomikosDataSourceBean(); - sourceBean.setXaDataSource((DruidXADataSource) DruidDataSourceOne); + sourceBean.setXaDataSource((DruidXADataSource) druidDataSourceOne); + // 必须为数据源指定唯一标识 sourceBean.setUniqueResourceName("db1"); return sourceBean; } /** - * 创建支持XA事务的Atomikos数据源2,不要用@Primary去修饰 + * 创建支持XA事务的Atomikos数据源2 */ @Bean - public DataSource dataSourceTwo(DataSource DruidDataSourceTwo) { + public DataSource dataSourceTwo(DataSource druidDataSourceTwo) { AtomikosDataSourceBean sourceBean = new AtomikosDataSourceBean(); - sourceBean.setXaDataSource((DruidXADataSource) DruidDataSourceTwo); + sourceBean.setXaDataSource((DruidXADataSource) druidDataSourceTwo); sourceBean.setUniqueResourceName("db2"); return sourceBean; } - /** - * 设置多数据源,不要用@Primary去修饰 - */ - @Bean - public DataSource dynamicDataSource(DataSource dataSourceOne, DataSource dataSourceTwo) { - DynamicDataSource dynamicDataSource = new DynamicDataSource(); - // 设置默认数据源 - dynamicDataSource.setDefaultTargetDataSource(dataSourceOne); - // 设置多数据源 - Map dsMap = new HashMap<>(); - dsMap.put(Data.DATASOURCE1, dataSourceOne); - dsMap.put(Data.DATASOURCE2, dataSourceTwo); - - dynamicDataSource.setTargetDataSources(dsMap); - return dynamicDataSource; - } - - /** * @param dataSourceOne 数据源1 * @return 数据源1的会话工厂 diff --git a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DynamicDataSource.java b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DynamicDataSource.java deleted file mode 100644 index d9cc5a2..0000000 --- a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/config/DynamicDataSource.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.heibaiying.springboot.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; - -/** - * @author : heibaiying - * @description : 动态数据源配置 - */ -@Slf4j -public class DynamicDataSource extends AbstractRoutingDataSource { - @Override - protected Object determineCurrentLookupKey() { - log.info("当前数据库:{}",DataSourceContextHolder.getDataSourceKey()); - return DataSourceContextHolder.getDataSourceKey(); - } -} diff --git a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/TransactionController.java b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/TransactionController.java index 9c09fab..abf0cdd 100644 --- a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/TransactionController.java +++ b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/TransactionController.java @@ -24,14 +24,14 @@ public class TransactionController { @RequestMapping("db1/change") @Transactional public void changeDb1() { - Programmer programmer = new Programmer(1, "xiaolandb1", 99, 6662.32f, new Date()); + Programmer programmer = new Programmer(1, "db1", 99, 6662.32f, new Date()); programmerDao.modify(Data.DATASOURCE1, programmer); } @RequestMapping("ts/db1/change") @Transactional public void changeTsDb1() { - Programmer programmer = new Programmer(1, "xiaolandb1", 88, 6662.32f, new Date()); + Programmer programmer = new Programmer(1, "db1", 88, 6662.32f, new Date()); programmerDao.modify(Data.DATASOURCE1, programmer); // 抛出异常 查看回滚 int j = 1 / 0; diff --git a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/XATransactionController.java b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/XATransactionController.java index 997a106..a7b8f1a 100644 --- a/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/XATransactionController.java +++ b/spring-boot/springboot-druid-mybatis-multi/src/main/java/com/heibaiying/springboot/controller/XATransactionController.java @@ -24,8 +24,8 @@ public class XATransactionController { @RequestMapping("/db/change") @Transactional public void changeDb() { - Programmer programmer01 = new Programmer(1, "xiaolandb1", 100, 6662.32f, new Date()); - Programmer programmer02 = new Programmer(1, "xiaohongdb2", 100, 6662.32f, new Date()); + Programmer programmer01 = new Programmer(1, "db1", 100, 6662.32f, new Date()); + Programmer programmer02 = new Programmer(1, "db2", 100, 6662.32f, new Date()); programmerDao.modify(Data.DATASOURCE1, programmer01); programmerDao.modify(Data.DATASOURCE2, programmer02); } @@ -33,8 +33,8 @@ public class XATransactionController { @RequestMapping("ts/db/change") @Transactional public void changeTsDb() { - Programmer programmer01 = new Programmer(1, "xiaolandb1", 99, 6662.32f, new Date()); - Programmer programmer02 = new Programmer(1, "xiaohongdb2", 99, 6662.32f, new Date()); + Programmer programmer01 = new Programmer(1, "db1", 99, 6662.32f, new Date()); + Programmer programmer02 = new Programmer(1, "db2", 99, 6662.32f, new Date()); programmerDao.modify(Data.DATASOURCE1, programmer01); programmerDao.modify(Data.DATASOURCE2, programmer02); int i = 1 / 0; diff --git a/spring-boot/springboot-druid-mybatis-multi/src/main/resources/sql/programmer.sql b/spring-boot/springboot-druid-mybatis-multi/src/main/resources/sql/programmer.sql new file mode 100644 index 0000000..71840fe --- /dev/null +++ b/spring-boot/springboot-druid-mybatis-multi/src/main/resources/sql/programmer.sql @@ -0,0 +1,8 @@ +-- 建表语句 +create table if not exists programmer ( + id int primary key auto_increment, + name varchar(20), + age tinyint, + salary float, + birthday datetime +) \ No newline at end of file diff --git a/spring-boot/springboot-druid-mybatis-multi/tmlog.lck b/spring-boot/springboot-druid-mybatis-multi/tmlog.lck deleted file mode 100644 index e69de29..0000000 diff --git a/spring-boot/springboot-druid-mybatis-multi/tmlog124.log b/spring-boot/springboot-druid-mybatis-multi/tmlog124.log deleted file mode 100644 index 6599888..0000000 --- a/spring-boot/springboot-druid-mybatis-multi/tmlog124.log +++ /dev/null @@ -1,3 +0,0 @@ -{"id":"10.0.75.1.tm154848923394100001","wasCommitted":true,"participants":[{"uri":"10.0.75.1.tm1","state":"COMMITTING","expires":1548489244031,"resourceName":"db1"},{"uri":"10.0.75.1.tm2","state":"COMMITTING","expires":1548489244031,"resourceName":"db2"}]} -{"id":"10.0.75.1.tm154848923394100001","wasCommitted":true,"participants":[{"uri":"10.0.75.1.tm1","state":"TERMINATED","expires":1548489244061,"resourceName":"db1"},{"uri":"10.0.75.1.tm2","state":"TERMINATED","expires":1548489244061,"resourceName":"db2"}]} -{"id":"10.0.75.1.tm154848925504500002","wasCommitted":false,"participants":[{"uri":"10.0.75.1.tm3","state":"TERMINATED","expires":1548489265019,"resourceName":"db1"},{"uri":"10.0.75.1.tm4","state":"TERMINATED","expires":1548489265019,"resourceName":"db2"}]}