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

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

研究成果如下:

1、首先配置多个datasource

[html] view
plain
copy

  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方法

[java] view
plain
copy

  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解决线程安全问题

[java] view
plain
copy

  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、数据源配置

[html] view
plain
copy

  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代码中手动切换数据源

[java] view
plain
copy

  1. CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);

6、或者用AOP动态切换数据源

package datasource;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

@Aspect

public class DynamicDataSourceAspect {

 @Pointcut("execution (public service.impl..*.*(..))")

 public void serviceExecution(){}

 

 @Before("serviceExecution()")

 public void setDynamicDataSource(JoinPoint jp) {

  for(Object o : jp.getArgs()) {

   //处理具体的逻辑 ,根据具体的境况CustomerContextHolder.setCustomerType()选取DataSource

  }

 }

}

搞定!



spring 多个数据库之间切换的更多相关文章

  1. 如何做到在虚拟数据库和真实数据库之间自由切换?【低调赠送:QQ高仿版GG 4.4 最新源码】

    记得以前在公司上班时,有时候白天的活没干完,我就会把工作带回家晚上加班继续做.但是,我们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是肯定连不上这台机器的.在家里没有数据库,服务端就跑不 ...

  2. 带事务管理的spring数据库动态切换

    动态切换数据源理论知识 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此:又例如:读写分离数据库配置的系统. 1.相信很多人都知道JDK代理,分静态代理和动态代理两种,同样的 ...

  3. Spring AOP实现Mysql数据库主从切换(一主多从)

    设置数据库主从切换的原因:数据库中经常发生的是“读多写少”,这样读操作对数据库压力比较大,通过采用数据库集群方案, 一个数据库是主库,负责写:其他为从库,负责读,从而实现读写分离增大数据库的容错率.  ...

  4. Spring Boot MyBatis 数据库集群访问实现

    Spring Boot MyBatis 数据库集群访问实现 本示例主要介绍了Spring Boot程序方式实现数据库集群访问,读库轮询方式实现负载均衡.阅读本示例前,建议你有AOP编程基础.mybat ...

  5. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

  6. 利用Spring.Net技术打造可切换的分布式缓存读写类

    利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具 ...

  7. spring boot + spring batch 读数据库文件写入文本文件&读文本文件写入数据库

    好久没有写博客,换了一家新公司,原来的公司用的是spring,现在这家公司用的是spring boot.然后,项目组布置了一个任务,关于两个数据库之间的表同步,我首先想到的就是spring batch ...

  8. MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  9. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

随机推荐

  1. iOS:UIResponser控件的介绍(响应者)

    UIResponser响应者控件   知识: 在iOS中不是任何对象都能处理事件,只有继承了UIResponser的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication,UIV ...

  2. string c++ 转义序列

    std::string shaderVS = "\struct PSInput \{ \float4 position : SV_POSITION;\float4 color : COLOR ...

  3. 深度增强学习--A3C

    A3C 它会创建多个并行的环境, 让多个拥有副结构的 agent 同时在这些并行环境上更新主结构中的参数. 并行中的 agent 们互不干扰, 而主结构的参数更新受到副结构提交更新的不连续性干扰, 所 ...

  4. 【日志处理】logstash性能优化配置

    2W条数据用时4秒完成,每秒5000条左右,昨天是同时写入到文件和标准输出,看起来是output的问题,这块性能应当可以满足性能要求了 后继我会继续把结果输出到tcp,kafka来测试经过grok后的 ...

  5. java实现快速排序算法

    1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据 ...

  6. 使用HTML5画布(canvas)生成阴影效果

    来源:GBin1.com 使用HTML5的画布特性,我们可以创建图形,在这片文章中,我们将创建图形的阴影. var canvas = document.getElementById('shadowca ...

  7. Unity5.1 新的网络引擎UNET(九) UNET 官方推荐视频教程

    孙广东  2015.7.14 在新的网络引擎出现之前,Unity提供的是 内置 Raknet网络引擎, 这一次Unity想更新UGUI一样,花了大的手笔更新了, UNET. 原来的旧的网络组件 被提示 ...

  8. 探寻C++最快的读取文件的方案

    https://www.byvoid.com/blog/fast-readfile/ 在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者都在cin ...

  9. python——修饰符

    修饰符基础--闭包 什么是闭包呢?标准的概念大家可以看wikipedia上的解释 举个例子: def do_add(base): def add(increase): return base + in ...

  10. lodash 移除数据元素 pull without 删除数组元素

    _.pull(array, [values]) 移除所有经过 SameValueZero 等值比较为 true 的元素 . without 不会修改原数组 <!DOCTYPE html> ...