利用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 ...
随机推荐
- php连接docker运行的mysql,显示(HY000/2002): Connection refused的解决办法
php要连接docker中运行的mysql是不能用localhost, 127.0.0.1来连接的,因为每个docker运行容器的localhost 127.0.0.1都是自己容器本身,不是mysql ...
- (a ==1 && a== 2 && a==3) 有可能是 true 吗?
今天看到这个题目,感到很有意思,查找了些资料,各位牛人果然有高招解决: 方法一: var a = { i: 1, toString: function () { return a.i++; } } i ...
- 小白老凯,初出茅庐!请多关照!简单分享一些 mysql 数据库的安装操作!请给为大神雅正!
在我们写代码,存储数据时常常会用到各种数据库,如:mysql.access.sql.server.Oracle等等,在这里就说一下mysql数据库的的操作指令! 首先我们了解下如何安装mysql数据库 ...
- String类-StringBuffer类-StringBuilder类的比较
package LC20130929; /** * 字符串处理类: StringBuffer ~~ StringBuilder 〉〉 String 效果一样但是,性能却大不一样! ...
- 关于datagridview控件如何动态改变行数问题
首先要把单元格转换成txt文本框然后根据TextChanged事件来进行修改就可以实现 private void Return_DGV_EditingControlShowing(object sen ...
- 【LuoguP4482】[BJWC2018]Border 的四种求法
题目链接 题意 区间 boder \(n,q\leq 2*10^5\) Sol (暴力哈希/SA可以水过) 字符串区间询问问题,考虑用 \(SAM\) 解决. boder相当于是询问区间 \([l,r ...
- Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian
链接: https://codeforces.com/contest/1220/problem/D 题意: Boy Dima gave Julian a birthday present - set ...
- [RxJS] RxJS Advanced Patterns Operate Heavily Dynamic UIs
Check the playground. import {Counter, CountDownState, ConterStateKeys, PartialCountDownState} from ...
- sqlserver 删除表 外键
Truncate table Menu --truncate不能对有外键的表 delete Menu delete RoleMenu SELECT * FROM sys.foreign_keys WH ...
- pycharm批量查找替换,正则匹配
ctrl + r:查找替换 ctrl+f:查找 ctrl+shift+r:全局查找替换 ctrl+alt+f:全局查找 shift+tab将代码左对齐 replace all 完成