spring+mybaits多数据源使用
一、在利用spring管理mybatis时可以同时配置多个数据源,并且数据源可以随时切换,但在多线程中多数据源的事务需要一定的配置。
多数据源配置:
- <bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.postgresql.driver}"/>
- <property name="url" value="${jdbc.postgresql.url}"/>
- <property name="username" value="${jdbc.postgresql.username}"/>
- <property name="password" value="${jdbc.postgresql.password}"/>
- <property name="initialSize" value="${jdbc.initialSize}"/>
- <property name="minIdle" value="${jdbc.minIdle}"/>
- <property name="maxIdle" value="${jdbc.maxIdle}"/>
- <property name="maxActive" value="${jdbc.maxActive}"/>
- <property name="maxWait" value="${jdbc.maxWait}"/>
- <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
- <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
- <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
- <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
- <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
- <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
- <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
- </bean>
- <bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.oracle.driver}"/>
- <property name="url" value="${jdbc.oracle.url}"/>
- <property name="username" value="${jdbc.oracle.username}"/>
- <property name="password" value="${jdbc.oracle.password}"/>
- <property name="initialSize" value="${jdbc.initialSize}"/>
- <property name="minIdle" value="${jdbc.minIdle}"/>
- <property name="maxIdle" value="${jdbc.maxIdle}"/>
- <property name="maxActive" value="${jdbc.maxActive}"/>
- <property name="maxWait" value="${jdbc.maxWait}"/>
- <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
- <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
- <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
- <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
- <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
- <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
- <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
- </bean>
- <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.mysql.driver}"/>
- <property name="url" value="${jdbc.mysql.url}"/>
- <property name="username" value="${jdbc.mysql.username}"/>
- <property name="password" value="${jdbc.mysql.password}"/>
- <property name="initialSize" value="${jdbc.initialSize}"/>
- <property name="minIdle" value="${jdbc.minIdle}"/>
- <property name="maxIdle" value="${jdbc.maxIdle}"/>
- <property name="maxActive" value="${jdbc.maxActive}"/>
- <property name="maxWait" value="${jdbc.maxWait}"/>
- <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
- <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
- <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
- <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
- <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
- <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
- <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
- </bean>
- <bean id="dataSource" class="orm.user.datasource.DataSource">
- <property name="targetDataSources">
- <map key-type="java.lang.String">
- <entry key="postgres" value-ref="postgresqlDataSource" />
- <entry key="oracle" value-ref="oracleDataSource" />
- <entry key="mysql" value-ref="mysqlDataSource"></entry>
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="postgresqlDataSource"></property>
- </bean>
- <!-- mybatis 配置 -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="databaseIdProvider" ref="databaseIdProvider" />
- <property name="configLocation" value="classpath:mybatis-config.xml" />
- </bean>
- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg ref="sqlSessionFactory" />
- </bean>
二、多数据源存在的问题是各个数据库类型直接的sql语句并不相同,比如mysql和postgresql的分页语句就不同,mybatis提供了一种简单的方法,首先你需要根据数据库类型写对应的sql语句,mybatis的VendorDatabaseIdProvider会根据数据源的类型选择对应的sql语句进行执行。
如下配置:
- <bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="properties">
- <props>
- <prop key="SQL Server">sqlserver</prop>
- <prop key="DB2">db2</prop>
- <prop key="Oracle">oracle</prop>
- <prop key="MySQL">mysql</prop>
- <prop key="PostgreSQL">postgresql</prop>
- </props>
- </property>
- </bean>
- <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
- <property name="properties" ref="vendorProperties"/>
- </bean>
三、在mybatis的mapper配置文件中进行 "_databaseId" 判断,是哪种数据源类型就使用相对应的sql语句
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="orm.user">
- <select id="getUser" resultType="orm.user.entity.User">
- <if test="_databaseId == 'mysql'">
- select * from tbl_user order by id desc limit 5
- </if>
- <if test="_databaseId == 'postgresql'">
- select * from tbl_user order by id desc limit 1 offset 0
- </if>
- </select>
- </mapper>
spring+mybaits多数据源使用的更多相关文章
- spring+mybaits xml配置解析----转
一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...
- Spring配置c3p0数据源时出错报:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
今天在使用Spring配置c3p0数据源时,使用的数据库是mysql,服务器是tomcat,运行时报了一个 java.lang.NoClassDefFoundError: com/mchange/v2 ...
- Spring配置动态数据源-读写分离和多数据源
在现在互联网系统中,随着用户量的增长,单数据源通常无法满足系统的负载要求.因此为了解决用户量增长带来的压力,在数据库层面会采用读写分离技术和数据库拆分等技术.读写分离就是就是一个Master数据库,多 ...
- 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...
- spring动态创建数据源
在最近的项目业务中,需要在程序的运行过程中,添加新的数据库添链接进来,然后从新数据库链接中读取数据. 网上查阅了资料,发现spring为多数据源提供了一个抽象类AbstractRoutingDataS ...
- spring + ibatis 多数据源事务(分布式事务)管理配置方法(转)
spring + ibatis 多数据源事务(分布式事务)管理配置方法(转) .我先要给大家讲一个概念:spring 的多数据源事务,这是民间的说法.官方的说法是:spring 的分布式事务.明白了这 ...
- Spring实现动态数据源,支持动态加入、删除和设置权重及读写分离
当项目慢慢变大,訪问量也慢慢变大的时候.就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,由于项目多是使用Spring,因此下面说到某些操作可能会依赖于Spring. 在我经历过的项目中 ...
- spring mysql多数据源配置
spring mysql多数据源配置 @Configuration public class QuartzConfig { @Autowired private AutowireJobFactory ...
- Java spring mvc多数据源配置
1.首先配置两个数据库<bean id="dataSourceA" class="org.apache.commons.dbcp.BasicDataSource&q ...
随机推荐
- HDFS:NameNode、DataNode、SecondaryNameNode
可以一句话描述 HDFS:把客户端的大文件存放在很多节点的数据块中. HDFS设计原则: 1,文件以块(block)方式存储: 2,通过副本机制提高可靠度和读取吞吐量: 3,每个区块至少分到三台Dat ...
- 04_关于元数据,ResultSetMetaData对象以及API方法介绍
ResultSetMetaData对象 元数据,可以理解为数据的数据 Jdbc中的元数据是指数据库.表.列的定义信息. ResultSetMetaData对象表示结果集ResultSet对象的元 ...
- HTML5中 HTML列表/块/布局 韩俊强的博客
从简单到复杂HTML5详解:每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 1.HTML列表 1.有序 2.无序 3.有序star属性 4.有序无序列表 代码: ...
- Android开发学习之路--Android Studio项目目录结构简介
既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...
- 理解WebKit和Chromium: Chromium WebView和Chrome浏览器渲染机制
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 数据对比 前面介绍过Chromium WebView的时候,说过有关ChromiumWebView同Chrom ...
- 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
1 Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图 索引 序列 同义词 约束 3 创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...
- 学习笔记3-开发与运行(卸载)第一个ANDROID应用
新建Android项目 1. 配置好Android坏境以后,新建项目选择Android Project. 2. 选择针对哪个平台开发的应用(Android2/Android4等) ...
- 关于android app签名文件获取sha1和MD值
最近在做百度地图的嵌入,因为从同事接手的android app,所以第一次接触android的签名. 总的来说签名还比较简单,我用的是eclipse ADT自带的签名工具来做的签名,方法如下: 选择项 ...
- 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 ...
- Windows2003下用Dreamweaver打开CodeSmith文件设置办法
.在第一行的ASP,字符串后面添加CST,2.找到行ASP,ASA:ActiveServer Pages修改为ASP,ASA,CST:ActiveServer Pages 二.用记事本打开文件2:C: ...