From 1603507d3250c0a1ef7072c7ad02499bdbe3606c Mon Sep 17 00:00:00 2001 From: luyya Date: Mon, 15 Jul 2024 15:39:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/config/DataSourceConfig.java | 69 +++++++++++++++++++ .../manager/config/DataSourceUtil.java | 40 +++++++++++ .../manager/config/DynamicDataSource.java | 13 ++++ 3 files changed, 122 insertions(+) create mode 100644 basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceConfig.java create mode 100644 basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceUtil.java create mode 100644 basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DynamicDataSource.java diff --git a/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceConfig.java b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceConfig.java new file mode 100644 index 0000000..e5c381b --- /dev/null +++ b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceConfig.java @@ -0,0 +1,69 @@ +package basepro.manager.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class DataSourceConfig { + /** + * 数据源1 + * spring.datasource.db1:application.properteis中对应属性的前缀 + * @return + */ + @Bean(name = "db1") + @ConfigurationProperties(prefix = "spring.datasource.druid.db1") + public DataSource dataSourceOne() { + return DataSourceBuilder.create().build(); + } + + /** + * 数据源2 + * spring.datasource.db2:application.properteis中对应属性的前缀 + * @return + */ + @Bean(name = "db2") + @ConfigurationProperties(prefix = "spring.datasource.druid.db2") + public DataSource dataSourceTwo() { + return DataSourceBuilder.create().build(); + } + + + /** + * 动态数据源: 通过AOP在不同数据源之间动态切换 + * @return + */ + @Primary + @Bean(name = "dynamicDataSource") + public DataSource dynamicDataSource() { + DynamicDataSource dynamicDataSource = new DynamicDataSource(); + // 默认数据源 + dynamicDataSource.setDefaultTargetDataSource(dataSourceOne()); + // 配置多数据源 + Map dsMap = new HashMap<>(); + dsMap.put("db1", dataSourceOne()); + dsMap.put("db2", dataSourceTwo()); + + dynamicDataSource.setTargetDataSources(dsMap); + return dynamicDataSource; + } + + /** + * 配置多数据源后IOC中存在多个数据源了,事务管理器需要重新配置,不然器不知道选择哪个数据源 + * 事务管理器此时管理的数据源将是动态数据源dynamicDataSource + * 配置@Transactional注解 + * @return + */ + @Bean + public PlatformTransactionManager transactionManager() { + return new DataSourceTransactionManager(dynamicDataSource()); + } +} diff --git a/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceUtil.java b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceUtil.java new file mode 100644 index 0000000..84acd83 --- /dev/null +++ b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DataSourceUtil.java @@ -0,0 +1,40 @@ +package basepro.manager.config; + +/** + * 数据源切换工具 + * @date 2022/5/19 + */ +public class DataSourceUtil { + /** + * 默认数据源 + */ + public static final String DEFAULT_DS = "db1"; + /** + * 数据源属于一个公共的资源 + * 采用ThreadLocal可以保证在多线程情况下线程隔离 + */ + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + /** + * 设置数据源名 + * @param dbType + */ + public static void setDB(String dbType) { + contextHolder.set(dbType); + } + + /** + * 获取数据源名 + * @return + */ + public static String getDB() { + return (contextHolder.get()); + } + + /** + * 清除数据源名 + */ + public static void clearDB() { + contextHolder.remove(); + } +} diff --git a/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DynamicDataSource.java b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DynamicDataSource.java new file mode 100644 index 0000000..92d3213 --- /dev/null +++ b/basepro-manager/basepro-manager-service/src/main/java/basepro/manager/config/DynamicDataSource.java @@ -0,0 +1,13 @@ +package basepro.manager.config; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +/** + * 动态数据源类 + * @date 2022/2/11 + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + @Override + protected Object determineCurrentLookupKey() { + return DataSourceUtil.getDB(); + } +}