有什么教做甜品的网站,单页推广网站模版,深圳最近一个星期新闻,网站建设图片上传【Spring】DynamicDataSourceHolder 动态数据源切换 常见场景常见工具一、AbstractRoutingDataSource1.1、 定义 DynamicDataSourceHolder1.2、 配置动态数据源1.3、 在Spring配置中定义数据源1.4、在业务代码中切换数据源 二、Dynamic Datasource for Spring Boot2.1. 添加依赖… 【Spring】DynamicDataSourceHolder 动态数据源切换 常见场景常见工具一、AbstractRoutingDataSource1.1、 定义 DynamicDataSourceHolder1.2、 配置动态数据源1.3、 在Spring配置中定义数据源1.4、在业务代码中切换数据源 二、Dynamic Datasource for Spring Boot2.1. 添加依赖2.2. 配置数据源 2.3. 使用注解切换数据源2.4. 启动类配置 三、阿里巴巴的Druid3.1. 引入依赖3.2. 配置多数据源3.3. 实现动态数据源路由3.4. 创建数据源上下文持有者3.5. 配置数据源3.6. 使用动态数据源   一个开发系统需要用多个数据库怎么办呢可不可以连接多个数据库 当然可以随意切换。 DynamicDataSourceHolder 通常是用于动态数据源切换的一个工具类特别是在多数据源场景下使用。它通过 ThreadLocal 来保存当前线程的数据源标识以便在同一线程中能够动态切换不同的数据源。 
常见场景 
在实际项目中可能需要根据不同的业务需求在多个数据源之间进行切换。比如读写分离主从库、多租户架构等。通过DynamicDataSourceHolder可以方便地实现这一需求。 
常见工具 
有许多现有的动态数据源管理工具和框架可以帮助简化多数据源配置和管理。以下是一些常用的工具和框架 Spring Boot DataSource Routing with AbstractRoutingDataSource Spring本身提供了 AbstractRoutingDataSource 类可以用于实现动态数据源路由。  Spring Cloud DataSource Routing 在Spring Cloud环境中可以使用Spring Cloud提供的配置和工具实现动态数据源管理。  MyBatis Dynamic Datasource MyBatis提供了一个动态数据源插件mybatis-spring可以用于在MyBatis中实现动态数据源切换。  Dynamic Datasource for Spring Boot 动态数据源管理库 dynamic-datasource-spring-boot-starter是一个简单易用的Spring Boot动态数据源启动器支持多种数据源配置和切换。  Druid Dynamic Datasource 阿里巴巴的Druid数据源也支持动态数据源切换可以通过配置Druid的相关属性实现。  
下面详细介绍一下 Spring本身提供的 AbstractRoutingDataSource 、SpringBoot 动态数据启动器、以及现在常用的阿里巴巴的Druid数据源。 
一、AbstractRoutingDataSource 
1.1、 定义 DynamicDataSourceHolder 
public class DynamicDataSourceHolder {private static final ThreadLocalString contextHolder  new ThreadLocal();/*** 设置数据源* param dataSourceKey 数据源标识*/public static void setDataSource(String dataSourceKey) {contextHolder.set(dataSourceKey);}/*** 获取数据源* return 数据源标识*/public static String getDataSource() {return contextHolder.get();}/*** 清除数据源*/public static void clearDataSource() {contextHolder.remove();}
}1.2、 配置动态数据源 
需要配置一个 AbstractRoutingDataSource 来实现动态数据源的路由。 
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicRoutingDataSource extends AbstractRoutingDataSource {Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceHolder.getDataSource();}
}1.3、 在Spring配置中定义数据源 
在Spring配置中定义数据源并将动态数据源配置为主数据源。 
import org.springframework.beans.factory.annotation.Qualifier;
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.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;Configuration
public class DataSourceConfig {Bean(name  dataSource1)ConfigurationProperties(prefix  spring.datasource.ds1)public DataSource dataSource1() {return DataSourceBuilder.create().build();}Bean(name  dataSource2)ConfigurationProperties(prefix  spring.datasource.ds2)public DataSource dataSource2() {return DataSourceBuilder.create().build();}PrimaryBean(name  dataSource)public DataSource dataSource(Qualifier(dataSource1) DataSource dataSource1,Qualifier(dataSource2) DataSource dataSource2) {DynamicRoutingDataSource dynamicRoutingDataSource  new DynamicRoutingDataSource();MapObject, Object targetDataSources  new HashMap();targetDataSources.put(ds1, dataSource1);targetDataSources.put(ds2, dataSource2);dynamicRoutingDataSource.setTargetDataSources(targetDataSources);dynamicRoutingDataSource.setDefaultTargetDataSource(dataSource1);return dynamicRoutingDataSource;}
}1.4、在业务代码中切换数据源 
在需要切换数据源的业务逻辑中使用 DynamicDataSourceHolder 来设置当前数据源。 
Service
public class SomeService {Transactionalpublic void someMethod() {// 切换到数据源 ds1DynamicDataSourceHolder.setDataSource(ds1);// 执行与数据源 ds1 相关的操作// 切换到数据源 ds2DynamicDataSourceHolder.setDataSource(ds2);// 执行与数据源 ds2 相关的操作// 恢复到默认数据源DynamicDataSourceHolder.clearDataSource();}
}DynamicDataSourceHolder 通过 ThreadLocal 实现了线程级别的数据源切换结合 AbstractRoutingDataSource 实现动态数据源路由可以方便地在多数据源场景下进行数据源的动态切换。需要注意的是在使用动态数据源时要确保在合适的时机清除线程本地变量以防止数据源混乱。 
二、Dynamic Datasource for Spring Boot 
2.1. 添加依赖 
在pom.xml中添加dynamic-datasource-spring-boot-starter依赖 
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion3.4.0/version
/dependency2.2. 配置数据源 
在application.yml或application.properties中配置多个数据源 
spring:datasource:dynamic:primary: masterdatasource:master:url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver2.3. 使用注解切换数据源 
使用DS 注解在需要的方法或类上指定数据源 
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;Service
public class UserService {DS(slave)Transactionalpublic void getSlaveData() {// 逻辑使用从库数据源}DS(master)Transactionalpublic void getMasterData() {// 逻辑使用主库数据源}
}2.4. 启动类配置 
在Spring Boot启动类中启用动态数据源支持 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}三、阿里巴巴的Druid 
阿里巴巴的Druid 是一个高效、稳定且功能强大的数据库连接池支持监控、日志输出和多种数据库管理功能。Druid也支持动态数据源切换通过配置Druid的相关属性和使用Spring的AbstractRoutingDataSource来实现。 
3.1. 引入依赖 
在你的Spring Boot项目中引入Druid依赖 
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.8/version
/dependency3.2. 配置多数据源 
在 application.yml 中配置多个数据源。Druid支持的数据源配置属性非常丰富可以配置连接池大小、超时设置、日志等。 
spring:datasource:dynamic:primary: masterdatasource:master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: rootdruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20filters: stat,wall,log4jslave:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: rootdruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20filters: stat,wall,log4j3.3. 实现动态数据源路由 
通过继承Spring的 AbstractRoutingDataSource 实现动态数据源路由逻辑。 
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicRoutingDataSource extends AbstractRoutingDataSource {Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSourceKey();}
}3.4. 创建数据源上下文持有者 
使用 ThreadLocal 来保存当前线程的数据源标识。 
public class DynamicDataSourceContextHolder {private static final ThreadLocalString CONTEXT_HOLDER  new ThreadLocal();public static void setDataSourceKey(String key) {CONTEXT_HOLDER.set(key);}public static String getDataSourceKey() {return CONTEXT_HOLDER.get();}public static void clearDataSourceKey() {CONTEXT_HOLDER.remove();}
}3.5. 配置数据源 
在Spring配置类中配置Druid数据源和动态数据源路由。 
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
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.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;Configuration
public class DataSourceConfig {BeanConfigurationProperties(spring.datasource.dynamic.datasource.master)public DataSource masterDataSource() {return DruidDataSourceBuilder.create().build();}BeanConfigurationProperties(spring.datasource.dynamic.datasource.slave)public DataSource slaveDataSource() {return DruidDataSourceBuilder.create().build();}PrimaryBeanpublic DataSource dataSource(Qualifier(masterDataSource) DataSource masterDataSource,Qualifier(slaveDataSource) DataSource slaveDataSource) {DynamicRoutingDataSource dynamicRoutingDataSource  new DynamicRoutingDataSource();MapObject, Object targetDataSources  new HashMap();targetDataSources.put(master, masterDataSource);targetDataSources.put(slave, slaveDataSource);dynamicRoutingDataSource.setTargetDataSources(targetDataSources);dynamicRoutingDataSource.setDefaultTargetDataSource(masterDataSource);return dynamicRoutingDataSource;}
}3.6. 使用动态数据源 
在需要切换数据源的业务逻辑中使用 DynamicDataSourceContextHolder 来设置当前数据源。 
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;Service
public class UserService {Transactionalpublic void useMaster() {DynamicDataSourceContextHolder.setDataSourceKey(master);// 使用主库执行操作DynamicDataSourceContextHolder.clearDataSourceKey();}Transactionalpublic void useSlave() {DynamicDataSourceContextHolder.setDataSourceKey(slave);// 使用从库执行操作DynamicDataSourceContextHolder.clearDataSourceKey();}
}总结 Druid Dynamic Datasource通过结合Spring的AbstractRoutingDataSource和ThreadLocal实现了高效的动态数据源切换。配置和使用都相对简单并且具有Druid连接池的强大功能如监控、性能优化等。适用于多数据源、读写分离、多租户等复杂场景。 文章转载自: http://www.morning.bctr.cn.gov.cn.bctr.cn http://www.morning.snjpj.cn.gov.cn.snjpj.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.fnbtn.cn.gov.cn.fnbtn.cn http://www.morning.xsszn.cn.gov.cn.xsszn.cn http://www.morning.ryrpq.cn.gov.cn.ryrpq.cn http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.mfmbn.cn.gov.cn.mfmbn.cn http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.xrpwk.cn.gov.cn.xrpwk.cn http://www.morning.ryglh.cn.gov.cn.ryglh.cn http://www.morning.nwllb.cn.gov.cn.nwllb.cn http://www.morning.rgrys.cn.gov.cn.rgrys.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.gwtgt.cn.gov.cn.gwtgt.cn http://www.morning.njstzsh.com.gov.cn.njstzsh.com http://www.morning.cwpny.cn.gov.cn.cwpny.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.hqzmz.cn.gov.cn.hqzmz.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.kxgn.cn.gov.cn.kxgn.cn http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn http://www.morning.rppf.cn.gov.cn.rppf.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.pcshb.cn.gov.cn.pcshb.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.mbrbg.cn.gov.cn.mbrbg.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.nswcw.cn.gov.cn.nswcw.cn http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.mqffm.cn.gov.cn.mqffm.cn http://www.morning.syxmx.cn.gov.cn.syxmx.cn http://www.morning.fyskq.cn.gov.cn.fyskq.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.smspc.cn.gov.cn.smspc.cn http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn http://www.morning.lsfzq.cn.gov.cn.lsfzq.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.kxymr.cn.gov.cn.kxymr.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.gnmhy.cn.gov.cn.gnmhy.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.npxht.cn.gov.cn.npxht.cn http://www.morning.lpyjq.cn.gov.cn.lpyjq.cn http://www.morning.bccls.cn.gov.cn.bccls.cn http://www.morning.htbsk.cn.gov.cn.htbsk.cn http://www.morning.hytqt.cn.gov.cn.hytqt.cn http://www.morning.qgqck.cn.gov.cn.qgqck.cn http://www.morning.nynyj.cn.gov.cn.nynyj.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.zmqb.cn.gov.cn.zmqb.cn http://www.morning.rlfr.cn.gov.cn.rlfr.cn http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.thpns.cn.gov.cn.thpns.cn http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn http://www.morning.mzmqg.cn.gov.cn.mzmqg.cn http://www.morning.nwljj.cn.gov.cn.nwljj.cn http://www.morning.wqsjx.cn.gov.cn.wqsjx.cn http://www.morning.cpqwb.cn.gov.cn.cpqwb.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.ktsth.cn.gov.cn.ktsth.cn http://www.morning.wjlkz.cn.gov.cn.wjlkz.cn http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn http://www.morning.spxsm.cn.gov.cn.spxsm.cn http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn http://www.morning.plqsc.cn.gov.cn.plqsc.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn http://www.morning.zdmlt.cn.gov.cn.zdmlt.cn http://www.morning.sqqhd.cn.gov.cn.sqqhd.cn