一、在利用spring管理mybatis时可以同时配置多个数据源,并且数据源可以随时切换,但在多线程中多数据源的事务需要一定的配置。

多数据源配置:

  1. <bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  2. <property name="driverClassName" value="${jdbc.postgresql.driver}"/>
  3. <property name="url" value="${jdbc.postgresql.url}"/>
  4. <property name="username" value="${jdbc.postgresql.username}"/>
  5. <property name="password" value="${jdbc.postgresql.password}"/>
  6. <property name="initialSize" value="${jdbc.initialSize}"/>
  7. <property name="minIdle" value="${jdbc.minIdle}"/>
  8. <property name="maxIdle" value="${jdbc.maxIdle}"/>
  9. <property name="maxActive" value="${jdbc.maxActive}"/>
  10. <property name="maxWait" value="${jdbc.maxWait}"/>
  11. <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
  12. <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
  13. <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
  14. <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
  15. <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
  16. <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
  17. <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
  18. </bean>
  19. <bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  20. <property name="driverClassName" value="${jdbc.oracle.driver}"/>
  21. <property name="url" value="${jdbc.oracle.url}"/>
  22. <property name="username" value="${jdbc.oracle.username}"/>
  23. <property name="password" value="${jdbc.oracle.password}"/>
  24. <property name="initialSize" value="${jdbc.initialSize}"/>
  25. <property name="minIdle" value="${jdbc.minIdle}"/>
  26. <property name="maxIdle" value="${jdbc.maxIdle}"/>
  27. <property name="maxActive" value="${jdbc.maxActive}"/>
  28. <property name="maxWait" value="${jdbc.maxWait}"/>
  29. <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
  30. <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
  31. <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
  32. <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
  33. <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
  34. <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
  35. <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
  36. </bean>
  37. <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  38. <property name="driverClassName" value="${jdbc.mysql.driver}"/>
  39. <property name="url" value="${jdbc.mysql.url}"/>
  40. <property name="username" value="${jdbc.mysql.username}"/>
  41. <property name="password" value="${jdbc.mysql.password}"/>
  42. <property name="initialSize" value="${jdbc.initialSize}"/>
  43. <property name="minIdle" value="${jdbc.minIdle}"/>
  44. <property name="maxIdle" value="${jdbc.maxIdle}"/>
  45. <property name="maxActive" value="${jdbc.maxActive}"/>
  46. <property name="maxWait" value="${jdbc.maxWait}"/>
  47. <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
  48. <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
  49. <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
  50. <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
  51. <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
  52. <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
  53. <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
  54. </bean>
  55.  
  56. <bean id="dataSource" class="orm.user.datasource.DataSource">
  57. <property name="targetDataSources">
  58. <map key-type="java.lang.String">
  59. <entry key="postgres" value-ref="postgresqlDataSource" />
  60. <entry key="oracle" value-ref="oracleDataSource" />
  61. <entry key="mysql" value-ref="mysqlDataSource"></entry>
  62. </map>
  63. </property>
  64. <property name="defaultTargetDataSource" ref="postgresqlDataSource"></property>
  65. </bean>
  1. <!-- mybatis 配置 -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="databaseIdProvider" ref="databaseIdProvider" />
  5. <property name="configLocation" value="classpath:mybatis-config.xml" />
  6.  
  7. </bean>
  8.  
  9. <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
  10. <constructor-arg ref="sqlSessionFactory" />
  11. </bean>

二、多数据源存在的问题是各个数据库类型直接的sql语句并不相同,比如mysql和postgresql的分页语句就不同,mybatis提供了一种简单的方法,首先你需要根据数据库类型写对应的sql语句,mybatis的VendorDatabaseIdProvider会根据数据源的类型选择对应的sql语句进行执行。

如下配置:

  1. <bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  2. <property name="properties">
  3. <props>
  4. <prop key="SQL Server">sqlserver</prop>
  5. <prop key="DB2">db2</prop>
  6. <prop key="Oracle">oracle</prop>
  7. <prop key="MySQL">mysql</prop>
  8. <prop key="PostgreSQL">postgresql</prop>
  9. </props>
  10. </property>
  11. </bean>
  12. <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
  13. <property name="properties" ref="vendorProperties"/>
  14. </bean>

三、在mybatis的mapper配置文件中进行 "_databaseId" 判断,是哪种数据源类型就使用相对应的sql语句

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="orm.user">
  4. <select id="getUser" resultType="orm.user.entity.User">
  5.  
  6. <if test="_databaseId == 'mysql'">
  7. select * from tbl_user order by id desc limit 5
  8. </if>
  9.  
  10. <if test="_databaseId == 'postgresql'">
  11. select * from tbl_user order by id desc limit 1 offset 0
  12. </if>
  13.  
  14. </select>
  15.  
  16. </mapper>

spring+mybaits多数据源使用的更多相关文章

  1. spring+mybaits xml配置解析----转

    一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...

  2. Spring配置c3p0数据源时出错报:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    今天在使用Spring配置c3p0数据源时,使用的数据库是mysql,服务器是tomcat,运行时报了一个 java.lang.NoClassDefFoundError: com/mchange/v2 ...

  3. Spring配置动态数据源-读写分离和多数据源

    在现在互联网系统中,随着用户量的增长,单数据源通常无法满足系统的负载要求.因此为了解决用户量增长带来的压力,在数据库层面会采用读写分离技术和数据库拆分等技术.读写分离就是就是一个Master数据库,多 ...

  4. 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离

    前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...

  5. spring动态创建数据源

    在最近的项目业务中,需要在程序的运行过程中,添加新的数据库添链接进来,然后从新数据库链接中读取数据. 网上查阅了资料,发现spring为多数据源提供了一个抽象类AbstractRoutingDataS ...

  6. spring + ibatis 多数据源事务(分布式事务)管理配置方法(转)

    spring + ibatis 多数据源事务(分布式事务)管理配置方法(转) .我先要给大家讲一个概念:spring 的多数据源事务,这是民间的说法.官方的说法是:spring 的分布式事务.明白了这 ...

  7. Spring实现动态数据源,支持动态加入、删除和设置权重及读写分离

    当项目慢慢变大,訪问量也慢慢变大的时候.就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,由于项目多是使用Spring,因此下面说到某些操作可能会依赖于Spring. 在我经历过的项目中 ...

  8. spring mysql多数据源配置

    spring mysql多数据源配置 @Configuration public class QuartzConfig { @Autowired private AutowireJobFactory ...

  9. Java spring mvc多数据源配置

    1.首先配置两个数据库<bean id="dataSourceA" class="org.apache.commons.dbcp.BasicDataSource&q ...

随机推荐

  1. HDFS:NameNode、DataNode、SecondaryNameNode

    可以一句话描述 HDFS:把客户端的大文件存放在很多节点的数据块中. HDFS设计原则: 1,文件以块(block)方式存储: 2,通过副本机制提高可靠度和读取吞吐量: 3,每个区块至少分到三台Dat ...

  2. 04_关于元数据,ResultSetMetaData对象以及API方法介绍

     ResultSetMetaData对象 元数据,可以理解为数据的数据 Jdbc中的元数据是指数据库.表.列的定义信息. ResultSetMetaData对象表示结果集ResultSet对象的元 ...

  3. HTML5中 HTML列表/块/布局 韩俊强的博客

    从简单到复杂HTML5详解:每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 1.HTML列表 1.有序 2.无序 3.有序star属性 4.有序无序列表 代码: ...

  4. Android开发学习之路--Android Studio项目目录结构简介

    既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...

  5. 理解WebKit和Chromium: Chromium WebView和Chrome浏览器渲染机制

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 数据对比 前面介绍过Chromium WebView的时候,说过有关ChromiumWebView同Chrom ...

  6. 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算

     1  Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图   索引  序列  同义词   约束 3  创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...

  7. 学习笔记3-开发与运行(卸载)第一个ANDROID应用

    新建Android项目 1.      配置好Android坏境以后,新建项目选择Android Project. 2.      选择针对哪个平台开发的应用(Android2/Android4等) ...

  8. 关于android app签名文件获取sha1和MD值

    最近在做百度地图的嵌入,因为从同事接手的android app,所以第一次接触android的签名. 总的来说签名还比较简单,我用的是eclipse ADT自带的签名工具来做的签名,方法如下: 选择项 ...

  9. was unable to start within 45 seconds. If the server requires more time, try increasing the timeout

    在eclipse启动tomcat时遇到超时45秒的问题: Server Tomcat v7.0 Server at localhost was unable to startwithin 45 sec ...

  10. Windows2003下用Dreamweaver打开CodeSmith文件设置办法

    .在第一行的ASP,字符串后面添加CST,2.找到行ASP,ASA:ActiveServer Pages修改为ASP,ASA,CST:ActiveServer Pages 二.用记事本打开文件2:C: ...