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

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

研究成果如下:

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:菜单控制器和菜单项:UIMenuController和UIMenuItem

    菜单控制器和菜单项:弹出自定义的菜单栏窗口 提示: 1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES2. Menu所处的View必须 ...

  2. 流畅的python第十九章元编程学习记录

    在 Python 中,数据的属性和处理数据的方法统称属性(attribute).其实,方法只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法 ...

  3. iOS 程序从开发完到上 AppStore 那点事儿

    收录待用,修改转载已取得腾讯云授权 一.账号体系 想要进行iOS开发,除了必备一台装有Mac OS X/Xcode的Mac开发机(iMac or MacBook)之外,还必须要有苹果开发者账号,只有拥 ...

  4. ​Mac触控板常用的手势操作

    ​Mac触控板常用的手势操作 学习了:http://topbook.cc/archives/151   一个手指直接点击,类似Windows中鼠标左键功能,同时在苹果Safari等浏览器中,这个手势还 ...

  5. 工程web-inf 下文件,路径访问

    直接用相对路径../即可 效果:

  6. 在笛卡尔坐标系上描绘函数(x*x+1)/(x*x-1)曲线

    代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...

  7. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  8. javascript闭包传参就这么简单

    var query = (function (a) { return a; })('fx'); alert(query);

  9. 一学就会之ado.net(一)

    ado.net十一组用于和数据源进行交互的面向对象类库.数据源能够是数据库也能够是文本文件.excel表格或者XML文件. 简单来说.ado.net就是与不同的数据源进行交互(增删改查)的. ado. ...

  10. 程序猿的职场潜意识Top10

    什么叫潜规则?事实上就是不明文规定的一些规则,关键是他没法明文规定,由于有的规则太没节操. 在我们职场中有些规则你不遵守将举步艰难.而要玩转这些潜规则.那么你必需要具备例如以下10个潜意识: 1.项目 ...