转:

利用Spring的AbstractRoutingDataSource解决多数据源的问题

多数据源问题很常见,例如读写分离数据库配置。

原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题。

解决方法如下:

1、首先配置多个datasource

  1. 1 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  2. 2 <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
  3. 3 </property>
  4. 4 <property name="url" value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards">
  5. 5 </property>
  6. 6 <property name="username" value="youguess"></property>
  7. 7 <property name="password" value="youguess"></property>
  8. 8 </bean>
  9. 9 <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
  10. 10 <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
  11. 11 </property>
  12. 12 <property name="url" value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards">
  13. 13 </property>
  14. 14 <property name="username" value="youguess"></property>
  15. 15 <property name="password" value="youguess"></property>
  16. 16 </bean>

2、写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法

  1. 1 package com.standard.core.util;
  2. 2 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  3. 3 public class DynamicDataSource extends AbstractRoutingDataSource {
  4. 4 @Override
  5. 5 protected Object determineCurrentLookupKey() {
  6. 6 return CustomerContextHolder.getCustomerType();
  7. 7 }
  8. 8 }

3、利用ThreadLocal解决线程安全问题

  1. 1 package com.standard.core.util;
  2. 2 public class CustomerContextHolder {
  3. 3 public static final String DATA_SOURCE_A = "dataSource";
  4. 4 public static final String DATA_SOURCE_B = "dataSource2";
  5. 5 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  6. 6 public static void setCustomerType(String customerType) {
  7. 7 contextHolder.set(customerType);
  8. 8 }
  9. 9 public static String getCustomerType() {
  10. 10 return contextHolder.get();
  11. 11 }
  12. 12 public static void clearCustomerType() {
  13. 13 contextHolder.remove();
  14. 14 }
  15. 15 }

4、数据源配置

  1. 1 <bean id="dynamicDataSource" class="com.standard.core.util.DynamicDataSource" >
  2. 2 <property name="targetDataSources">
  3. 3 <map key-type="java.lang.String">
  4. 4 <entry value-ref="dataSource" key="dataSource"></entry>
  5. 5 <entry value-ref="dataSource2" key="dataSource2"></entry>
  6. 6 </map>
  7. 7 </property>
  8. 8 <property name="defaultTargetDataSource" ref="dataSource" >
  9. 9 </property>
  10. 10 </bean>

5、在DAOImpl中切换数据源

  1. 1 CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);

利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】的更多相关文章

  1. 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题

    多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...

  2. 利用Spring的AbstractRoutingDataSource解决多数据源的问题

    多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...

  3. 再析在spring框架中解决多数据源的问题

    在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中, ...

  4. mybatis配置多数据源(利用spring的AbstractRoutingDataSource)

    主要是利用了spring的AbstractRoutingDataSource. 直接上配置了: spring-mybatis.xml <bean name="dataSource&qu ...

  5. 如何在spring框架中解决多数据源的问题

    在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessi ...

  6. 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换

    最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...

  7. 使用Spring的AbstractRoutingDataSource实现多数据源切换

    https://www.cnblogs.com/softidea/p/7127874.html?utm_source=itdadao&utm_medium=referral https://b ...

  8. 30个类手写Spring核心原理之动态数据源切换(8)

    本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)( ...

  9. Spring 是如何解决循环依赖的?

    前言 相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的: 还会提示这么一句: Requested bean is currently in creation: Is there an ...

随机推荐

  1. Python Flask学习笔记(1)

    1.搭建虚拟环境 a. 安装 virtualenv : pip3 install virtualenv b. 建立虚拟环境 : 任意目录下建立一个空文件(我的是 Py_WorkSpace) ,在该文件 ...

  2. 【Java 基础项目 - - Bank项目4】 对象构造/跨package调用

    UML设计: 文件组织: (注: 在bank4中,直接调用bank3的内容, 不再重复编写代码即可!) 代码编写Bank.java: package Banking_4; import Banking ...

  3. solr不是自启动,添加code失败

    原文:https://blog.csdn.net/qq_30242987/article/details/100044964 我主要的问题是  conf要复制  configests/sample_t ...

  4. 使用ADB命令写Android自动化测试脚本

    使用脚本来执行测试的特点: ●书写方便 ●基本上可以实现90%以上的功能性覆盖 ●测试结果需要通过自己观察整个过程和日志文件来得出的 ●有些外部的动作,脚本是无法实现的,比如录入指纹 ●只适配特定尺寸 ...

  5. [唐胡璐]Selenium技巧- IE浏览器Zoom和Protected Model Setting

    Selenium Webdriver在IE下跑脚本的时候要保证页面大小为100%,且要在IE internet options, selectSecurity tab and uncheck “Ena ...

  6. redis序列化和反序列化

    RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”: 1) keySerializer :对于普通K-V操作时,ke ...

  7. PHP mysqli_fetch_field_direct() 函数

    返回结果集中某个单一字段(列)的 meta-data,并输出字段名称.表格和最大长度: mysqli_fetch_field_direct(result,fieldnr); 参数 描述 result ...

  8. Window Service安装不成功

    1. 加Winsow Service 2. 加Setup Project    Add -> Project Output , 选中Primary output from Winsow Serv ...

  9. LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题

    题目链接:给你n(n<=3e4)个路由地址(注意有子网掩码现象), 路由地址:128.0.0.0/1的形式 要求你输出一个路由集合,其是给定的路由集合的补集,且个数越少越好 #include & ...

  10. SpringMVC——数据乱码问题

    乱码解决: 1.controller传递数据给页面 :在RequestMapping当中指定produces="text/json;charset=utf-8" 2.Control ...