利用Spring的AbstractRoutingDataSource解决多数据源的问题(转)

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

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

研究成果如下:

1、首先配置多个datasource

[html] view plaincopy

  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 plaincopy

  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 plaincopy

  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 plaincopy

  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 plaincopy

  1. CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);

搞定!

利用Spring的AbstractRoutingDataSource解决多数据源的问题(转)

时间: 2024-11-06 21:53:13

利用Spring的AbstractRoutingDataSource解决多数据源的问题(转)的相关文章

利用Spring的AbstractRoutingDataSource解决多数据源的问题

多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 研究成果如下: 1.首先配置多个datasource [html] view plain copy <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName&quo

再析在spring框架中解决多数据源的问题

在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题. 总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同.各个数据源的数据结构相同.各个数据源的数据结构部分相同又有部分不同.对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通

如何在spring框架中解决多数据源的问题

在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessionFactory的dataSource属性总是指向这个数据源并且恒定不变,所有DAO在使用sessionFactory的时候都是通过这个数据源访问数据库.但是现在,由于项目的需要,我们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让session

Spring(AbstractRoutingDataSource)实现动态数据源切换

一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中.这种需求,在数据同步与定时任务中经常需要. 那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源,还得能灵活动态的切换数据源.以spring+hibernate框架项目为例(引用:http://blog.csdn.net/wangpeng047/article/details/8866239博客的图片): 单个数据源绑定给sessionFacto

Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中.这种需求,在数据同步与定时任务中经常需要. 那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源,还得能灵活动态的切换数据源.以spring+hibernate框架项目为例(引用:http://blog.csdn.net/wangpeng04

(转)利用Spring AOP自定义注解解决日志和签名校验

一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: boolean isValid = accountService.validSignature(appid, signature, client_signature); if (!isValid) return ErrorUtil.buildError(ErrorUtil.ERR_CODE_COM

springMVC+Mybatis(使用AbstractRoutingDataSource实现多数据源切换时)事务管理未生效的解决办法

业务场景: A.B两个单位,系统部署同一套代码: A.B两系统能相互访问: 要求将数据从A系统同步到B系统,再将反馈信息回发给A: 实际开发情况: 因为系统比较小,最开始设计架构的时候没有考虑到消息互通的方式,也没有设计分布式部署,所以采用AbstractRoutingDataSource灵活切换数据源的方式直接在业务代码中实现数据交互. 项目代码: applicationContext-common.xml: <?xml version="1.0" encoding="

利用Spring AOP自定义注解解决日志和签名校验

转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: boolean isValid = accountService.validSignature(appid, signature, client_signature); if (!

spring自动识别数据库并切换数据源

一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基本上没有什么问题,但唯一可能出现问题的就是在hibernate做添加操作生成主键策略的时候.因为我们都知道hibernate的数据库本地方言会针对不同的数据库采用不同的主键生成策略. 所以针对这一问题不得不采用自定义的主键生成策略,自己写一个主键生成器的表来维护主键生成方式或以及使用其他的方式来生成