利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】
转:
利用Spring的AbstractRoutingDataSource解决多数据源的问题
多数据源问题很常见,例如读写分离数据库配置。
原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题。
解决方法如下:
1、首先配置多个datasource

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

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

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

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

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

4、数据源配置

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

5、在DAOImpl中切换数据源
- 1 CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】的更多相关文章
- 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题
多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...
- 利用Spring的AbstractRoutingDataSource解决多数据源的问题
多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...
- 再析在spring框架中解决多数据源的问题
在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中, ...
- mybatis配置多数据源(利用spring的AbstractRoutingDataSource)
主要是利用了spring的AbstractRoutingDataSource. 直接上配置了: spring-mybatis.xml <bean name="dataSource&qu ...
- 如何在spring框架中解决多数据源的问题
在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessi ...
- 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换
最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...
- 使用Spring的AbstractRoutingDataSource实现多数据源切换
https://www.cnblogs.com/softidea/p/7127874.html?utm_source=itdadao&utm_medium=referral https://b ...
- 30个类手写Spring核心原理之动态数据源切换(8)
本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)( ...
- Spring 是如何解决循环依赖的?
前言 相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的: 还会提示这么一句: Requested bean is currently in creation: Is there an ...
随机推荐
- Python Flask学习笔记(1)
1.搭建虚拟环境 a. 安装 virtualenv : pip3 install virtualenv b. 建立虚拟环境 : 任意目录下建立一个空文件(我的是 Py_WorkSpace) ,在该文件 ...
- 【Java 基础项目 - - Bank项目4】 对象构造/跨package调用
UML设计: 文件组织: (注: 在bank4中,直接调用bank3的内容, 不再重复编写代码即可!) 代码编写Bank.java: package Banking_4; import Banking ...
- solr不是自启动,添加code失败
原文:https://blog.csdn.net/qq_30242987/article/details/100044964 我主要的问题是 conf要复制 configests/sample_t ...
- 使用ADB命令写Android自动化测试脚本
使用脚本来执行测试的特点: ●书写方便 ●基本上可以实现90%以上的功能性覆盖 ●测试结果需要通过自己观察整个过程和日志文件来得出的 ●有些外部的动作,脚本是无法实现的,比如录入指纹 ●只适配特定尺寸 ...
- [唐胡璐]Selenium技巧- IE浏览器Zoom和Protected Model Setting
Selenium Webdriver在IE下跑脚本的时候要保证页面大小为100%,且要在IE internet options, selectSecurity tab and uncheck “Ena ...
- redis序列化和反序列化
RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”: 1) keySerializer :对于普通K-V操作时,ke ...
- PHP mysqli_fetch_field_direct() 函数
返回结果集中某个单一字段(列)的 meta-data,并输出字段名称.表格和最大长度: mysqli_fetch_field_direct(result,fieldnr); 参数 描述 result ...
- Window Service安装不成功
1. 加Winsow Service 2. 加Setup Project Add -> Project Output , 选中Primary output from Winsow Serv ...
- LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题
题目链接:给你n(n<=3e4)个路由地址(注意有子网掩码现象), 路由地址:128.0.0.0/1的形式 要求你输出一个路由集合,其是给定的路由集合的补集,且个数越少越好 #include & ...
- SpringMVC——数据乱码问题
乱码解决: 1.controller传递数据给页面 :在RequestMapping当中指定produces="text/json;charset=utf-8" 2.Control ...