利用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 ...
随机推荐
- glRenderbufferStorageMultisample
https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glRenderbufferStorage.xhtml https://www. ...
- 《Redis 设计与实现》读书笔记(二)
单机数据库实现 九.数据库 1.服务器中的数据库 一个redis服务器保存多个数据库. struct redisServer { //一个数组,多个数据库 redisDb *db; } 当执行sele ...
- awk_printf
awk -F: 'BEGIN{printf "%-20s%-20s%-20s\n","User","UID","Home" ...
- MFC 树形控件
Tree Control属性:Has Buttons.Has Lines.Lines At Root这三个设为True 常用的事件:SelectChanged() ico图片放到项目的res文件夹中( ...
- 2 MVC设计模式
0 基础知识 (1)B/S与C/S结构 C/S(客户机/服务器 client/service):分为客户机和服务器两层,应用软件安装在客户端通过网络与服务器通信 B/S(liulanq/服务器 bro ...
- Luogu P2824 [HEOI2016/TJOI2016]排序 线段树+脑子
只会两个$log$的$qwq$ 我们二分答案:设答案为$ans$,则我们把$a[i]<=ans$全部设成$0$,把$a[i]>ans$全部设成$1$,扔到线段树里,这样区间排序(升序)就是 ...
- 用JavaScript实现快排
啥是快排这里就不讲了,主要还是把原来c++学的东西抓紧转化过来 快排运用的是分而治之的思想,确定一个中值,把大的放右边,小的放左边,然后再左右分别对左右的左右(雾)进行处理 需要注意的一点是,这玩意远 ...
- 洛谷【P2257】 YY的GCD
出处:http://www.cnblogs.com/peng-ym/p/8652288.html ( 直接去出处那看就好了 ) 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求 ...
- Java进阶知识14 Struts2中的S标签
1.A 开头 <s:a href=""></s:a> //超链接,类似于html里的<a></a> <s:action nam ...
- 【csp模拟赛2】 爆搜 方格加数
[题目描述] xyz1048576正在玩一个关于矩阵的游戏. 一个n*m的矩阵,矩阵中每个数都是[1,12]内的整数.你可以执行下列两个操作任意多次: (1)指定一行,将该行所有数字+1. (2)指定 ...