Spring多数据源的动态切换

目前很多项目中只能配置单个数据源,那么如果有多个数据源肿么办?Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问题。
1.写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法
public class DynamicDataSource extends AbstractRoutingDataSource{
 private final static Logger  logger  = LoggerFactory.getLogger("DynamicDataSource");   
 
    @Override  
    protected Object determineCurrentLookupKey() {   
        return DbContextHolder.getDbType();   
    }   
}


2.写一个线程安全的ThreadLocal

public class DbContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return (String) contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } }


3.dataSource的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-autowire="byName">

<bean id="aTestDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${a.jdbc.driverClassName}" />
<property name="url" value="${a.jdbc.url}" />
<property name="username" value="${a.jdbc.username}" />
<property name="password" value="${a.jdbc.password}" />
</bean>

<bean id="bTestDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${b.jdbc.driverClassName}" />
<property name="url" value="${gott.jdbc.url}" />
<property name="username" value="${b.jdbc.username}" />
<property name="password" value="${b.jdbc.password}" />
</bean>

<bean id="dataSource" class="***.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="aTestDataSource" value-ref="aTestDataSource" />
<entry key="bTestDataSource" value-ref="bTestDataSource" />
</map>
</property>
<property name="defaultTargetDataSource" ref="aTestDataSource" />
</bean>
</beans>


4.当需要切换数据源时,只要调用一行代码就可以了

DbContextHolder.setDbType("aTestDataSource");

当然有兴趣的朋友也可以用aop去自动切换数据源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud中实现多数据切换可以通过以下步骤来完成: 1. 配置多个数据:在application.properties或application.yml文件中,配置多个数据的连接信息,每个数据都有唯一的标识符。 2. 创建数据对象:通过DataSourceBuilder类创建多个数据对象,并将其绑定到对应的配置信息。 3. 创建多个JdbcTemplate对象:通过每个数据对象创建对应的JdbcTemplate对象,用于执行数据库操作。 4. 创建动态数据:通过AbstractRoutingDataSource类创建一个动态数据,重写determineCurrentLookupKey()方法,根据需要动态切换数据。 5. 配置事务管理器:为每个数据配置对应的事务管理器,以便在进行事务操作时正确切换数据。 6. 配置AOP切面:使用@Aspect注解定义一个切面类,在该类中使用@Around注解拦截需要切换数据的方法,在方法执行前根据条件动态切换数据。 7. 配置数据切换规则:定义一个枚举类或常量类,列举出可用的数据标识符,根据具体业务需要选择合适的数据。 8. 测试:在需要切换数据的地方调用相应的方法,并验证是否成功切换到了指定的数据。 问题产生的原因: 在微服务架构中,可能会存在多个数据库实例,每个实例存储不同的业务数据。为了能够根据具体的业务需求切换到对应的数据,需要实现多数据切换。 相关问题: 1. 如何配置多个数据? 2. 如何创建动态数据,并在运行时动态切换数据? 3. 如何配置事务管理器以支持多数据切换? 4. 如何通过AOP切面实现方法级别的数据切换? 5. 数据切换是否会影响事务操作? 6. 在多数据切换的场景下,如何处理事务一致性问题?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值