一、配置文件

properties

ds1.driverClassName=com.mysql.jdbc.Driver
ds1.url=jdbc:mysql://192.168.200.130:3306/test1?useUnicode=true&characterEncoding=UTF-8
ds1.username=hhh
ds1.password=123456 ds2.driverClassName=oracle.jdbc.OracleDriver
ds2.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8
ds2.username=qqq
ds2.password=123456

xml

   <bean id="dataSource" class="com.hhhqqq.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="ds1" value-ref="ds1" />
<entry key="ds2" value-ref="ds2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="ds1" />
</bean> <bean id="ds1" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="driverClassName" value="${ds1.driverClassName}" />
<property name="url" value="${ds1.url}" />
<property name="username" value="${ds1.username}" />
<property name="password" value="${ds1.password}" />
</bean>
<bean id="ds2" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="driverClassName" value="${ds2.driverClassName}" />
<property name="url" value="${ds2.url}" />
<property name="username" value="${ds2.username}" />
<property name="password" value="${ds2.password}" />
</bean>

二、Java文件

com.hhhqqq.datasource.DynamicDataSource源码

import java.util.logging.Logger;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* 取得当前使用那个数据源。
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDbType();
} public Logger getParentLogger() {
// TODO Auto-generated method stub
return null;
}
}

DataSourceContextHolder源码

public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); /**
* 设置当前数据库。
* @param dbType
*/
public static void setDbType(String dbType)
{
contextHolder.set(dbType);
} /**
* 取得当前数据源。
* @return
*/
public static String getDbType()
{
String str = (String) contextHolder.get();
return str;
} /**
* 清除上下文数据
*/
public static void clearDbType()
{
contextHolder.remove();
}
}

三、注意点

Spring单数据源直接在<bean id="dataSource">下配置数据源的各种连接参数。但动态数据源需要配置个各个数据源例如ds1、ds2等。然后在dataSource中动态根据传递过来的参数动态调用不同的数据源。
1、当进行访问时,首先通过DataSourceContextHolder.setDbType("ds1");设置需要使用的数据源。DataSourceContextHolder就是一个用来存储数据源信息的类,其中通过ThreadLocal来记录数据源信息。
2、DynamicDataSource类集成Spring的AbstractRoutingDataSource类,通过determineCurrentLookupKey方法来获取数据源类型,如果没有对应的数据源则使用defaultTargetDataSource配置。
3、当设置了数据源之后会一直使用该数据源进行连接,除非使用 DataSourceContextHolder.setDbType重新设置数据源或使用DataSourceContextHolder.clearDbType()清除,清除后使用defaultTargetDataSource进行连接。(这点很重要)

转载自:https://my.oschina.net/qweasfzxc880/blog/621113?p={{page}}

最新文章

  1. ubuntu --- shortcut key
  2. MongoDB 基础知识
  3. SQL ORDER BY 子句
  4. mac下安装和卸载软件
  5. QDialog之屏蔽Esc键(过滤,或者丢弃)
  6. Medium上关于git的文章
  7. mysql 增量导入到elasticsearch
  8. 新浪SAE快速上手教程
  9. POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
  10. [ An Ac a Day ^_^ ] hdu 2553 N皇后问题 搜索
  11. 2-SAT算法
  12. Class path &amp; Path
  13. web前端效率提升-nginx+nodejs搭建本地生态
  14. Android开发者的Anko使用指南(一)之Intent
  15. WPF 绕圈进度条(二)
  16. 搭建YUM仓库
  17. asp.net web api 权限验证的方法
  18. Oauth2.0(三):Access Token 与 Refresh Token
  19. [转]一个研究生毕业以后的人生规划[ZZ]
  20. POI事件模型处理execl导入功能(只支持07版本的execl)

热门文章

  1. Gridview 分多页时导出excel的解决方案
  2. HTML 代码复用实践 (静态页面公共部分提取复用)
  3. (C++)窗口置前SetForegroundWindow(pThis-&gt;hwndWindow);
  4. SpringMvc JSON 406,吐血。。。。
  5. asp.net webform 中使用Microsoft ASP.NET Web Optimization压缩js及css
  6. 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
  7. W5500 keep-alive的用途与用法--新华龙电子
  8. Lodop6 以上打印控件使用,详参考自带说明文档,打印样式及文字大小要特殊设置一下
  9. Linux系统下如何查看已经登录用户
  10. 如何创建vss2005的数据库