一、配置文件

properties

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

xml

  1.    <bean id="dataSource" class="com.hhhqqq.datasource.DynamicDataSource">
  2. <property name="targetDataSources">
  3. <map key-type="java.lang.String">
  4. <entry key="ds1" value-ref="ds1" />
  5. <entry key="ds2" value-ref="ds2" />
  6. </map>
  7. </property>
  8. <property name="defaultTargetDataSource" ref="ds1" />
  9. </bean>
  10.  
  11. <bean id="ds1" class="com.alibaba.druid.pool.DruidDataSource"
  12. destroy-method="close">
  13. <property name="driverClassName" value="${ds1.driverClassName}" />
  14. <property name="url" value="${ds1.url}" />
  15. <property name="username" value="${ds1.username}" />
  16. <property name="password" value="${ds1.password}" />
  17. </bean>
  18. <bean id="ds2" class="com.alibaba.druid.pool.DruidDataSource"
  19. destroy-method="close">
  20. <property name="driverClassName" value="${ds2.driverClassName}" />
  21. <property name="url" value="${ds2.url}" />
  22. <property name="username" value="${ds2.username}" />
  23. <property name="password" value="${ds2.password}" />
  24. </bean>

二、Java文件

com.hhhqqq.datasource.DynamicDataSource源码

  1. import java.util.logging.Logger;
  2. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  3. public class DynamicDataSource extends AbstractRoutingDataSource {
  4. /**
  5. * 取得当前使用那个数据源。
  6. */
  7. @Override
  8. protected Object determineCurrentLookupKey() {
  9. return DataSourceContextHolder.getDbType();
  10. }
  11.  
  12. public Logger getParentLogger() {
  13. // TODO Auto-generated method stub
  14. return null;
  15. }
  16. }

DataSourceContextHolder源码

  1. public class DataSourceContextHolder {
  2. private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  3.  
  4. /**
  5. * 设置当前数据库。
  6. * @param dbType
  7. */
  8. public static void setDbType(String dbType)
  9. {
  10. contextHolder.set(dbType);
  11. }
  12.  
  13. /**
  14. * 取得当前数据源。
  15. * @return
  16. */
  17. public static String getDbType()
  18. {
  19. String str = (String) contextHolder.get();
  20. return str;
  21. }
  22.  
  23. /**
  24. * 清除上下文数据
  25. */
  26. public static void clearDbType()
  27. {
  28. contextHolder.remove();
  29. }
  30. }

三、注意点

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}}

Spring+Mybatis多数据源配置的更多相关文章

  1. Spring+MyBatis多数据源配置实现

    最近用到了MyBatis配置多数据源,原以为简单配置下就行了,实际操作后发现还是要费些事的,这里记录下,以作备忘 不多废话,直接上代码,后面会有简单的实现介绍 jdbc和log4j的配置 #定义输出格 ...

  2. Spring Mybatis多数据源配置范例

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. spring mybatis 多数据源配置

    1.创建好数据库的配置文件 mysql.url=jdbc:mysql://***/***?useUnicode=true&characterEncoding=UTF-8 mysql.usern ...

  4. springMVC+spring+mybatis多数据源配置

    1.application.properties配置 <?xml version="1.0" encoding="UTF-8"?> <bean ...

  5. Spring实现多数据源配置

    一.前言 对于小型项目,服务器与数据库是可以在同一台机子上的,但随着业务的庞大与负责,数据库和服务器就会分离开来.同时随着数据量的增大,数据库也要分开部署到多台机子上. 二.Spring配置文件修改 ...

  6. Spring Boot 2.X(五):MyBatis 多数据源配置

    前言 MyBatis 多数据源配置,最近在项目建设中,需要在原有系统上扩展一个新的业务模块,特意将数据库分库,以便减少复杂度.本文直接以简单的代码示例,如何对 MyBatis 多数据源配置. 准备 创 ...

  7. MyBatis多数据源配置(读写分离)

    原文:http://blog.csdn.net/isea533/article/details/46815385 MyBatis多数据源配置(读写分离) 首先说明,本文的配置使用的最直接的方式,实际用 ...

  8. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  9. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

随机推荐

  1. LeetCode "468. Validate IP Address"

    it is all about corner-cases... class Solution(object): def validIP4(self, IP): def validNum4(s): tr ...

  2. Intellij IDEA +MAVEN+Jetty实现Mybatis的HelloWorld

    1 maven配置:pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  3. 代码安装apk文件

    Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); Uri uri = Uri.fromFile(file); in ...

  4. 右键添加 CMD 命令提示符

    # 右键添加 CMD 命令提示符 当然是修改注册表   - 打开注册表编辑器(按下Win+R打开运行对话框,输入regedit),找到[HKEY_CLASSES_ROOT/Folder/shell] ...

  5. 在VBA中使用Windows API

    VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...

  6. Actionscript Flash Event.ENTER_FRAME 延迟间隔非常大 并且 pre-render 耗时非常严重

    我遇到的问题是代码中不断的添加一个图标到舞台上,而且这个图标非常小,所以从内存也看不出什么问题. 但是由于舞台物件太多了,并且不断添加,导致渲染耗时严重. 而且这种错误,开发工具并不会报错,也不属于死 ...

  7. js正则表达式学习

    //几种字符串操作:var str = 'abcdef'; alert(str.search('b')); //弹出1:返回的是b在str中的位置:如果找不到返回-1: alert(str.subst ...

  8. email

    #region 邮件帮助类 //+-------------------------------------------------------------------+ //+ FileName: ...

  9. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  10. Java 判断文件夹、文件是否存在、否则创建文件夹

    1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...