iBatis多数据源的苦恼
在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。
采用spring的AbstractRoutingDataSource就可以简单的解决这个问题。
AbstractRoutingDataSource实现了javax.sql.DataSource接口,因此可以理解为一个虚拟的动态DataSource,在需要的时候根据上下文Context动态决定使用哪个数据源。
Spring+iBatis多数据源的配置
下面是一个完整的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
<!-- ========================= RESOURCE DEFINITIONS ========================= -->
<!-- Main JNDI DataSource for J2EE environments -->
<!-- Refers to the main database, containing product and account data -->
<!-- (see dataAccessContext-local.xml for an alternative) -->
<!--<jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/>-->
<!-- Additional JNDI DataSource for J2EE environments -->
<!-- Refers to the order database, containing order data -->
<!-- (see dataAccessContext-local.xml for an alternative) -->
<!--<jee:jndi-lookup id="orderDataSource" jndi-name="jdbc/jpetstore-order"/>-->
<bean id="sysDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbcsys.driverClassName}"/>
<property name="url" value="${jdbcsys.url}"/>
<property name="username" value="${jdbcsys.username}"/>
<property name="password" value="${jdbcsys.password}"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
<bean id="coreDataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbccore1.driverClassName}"/>
<property name="url" value="${jdbccore1.url}"/>
<property name="username" value="${jdbccore1.username}"/>
<property name="password" value="${jdbccore1.password}"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
<bean id="coreDataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbccore2.driverClassName}"/>
<property name="url" value="${jdbccore2.url}"/>
<property name="username" value="${jdbccore2.username}"/>
<property name="password" value="${jdbccore2.password}"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
<bean id="dataSource" class="com.bitfone.mvp.bulk.dao.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="SYSDB" value-ref="sysDataSource"/>
<entry key="COREDB1" value-ref="coreDataSource1"/>
<entry key="COREDB2" value-ref="coreDataSource2"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="sysDataSource"/>
</bean>
<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
<!-- Necessary here due to the need for distributed transactions across two databases -->
<!-- (see dataAccessContext-local.xml for an alternative) -->
<!--<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>-->
<!--<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<!--For release-->
<property name="configLocation" value="../config/dao/sql-map-config.xml"/>
<!--For Test-->
<!--<property name="configLocation" value="classpath:dao/sql-map-config.xml"/>-->
</bean>
</beans>
其核心是DynamicDataSource,代码如下
public class DynamicDataSource extends AbstractRoutingDataSource
{
protected Object determineCurrentLookupKey()
{
return DbContextHolder.getDbType();
}
}
上下文DbContextHolder为一线程安全的ThreadLocal,如下
public class DbContextHolder
{
private static final ThreadLocal contextHolder = new ThreadLocal();
public static void setDbType(String dbType) {
contextHolder.set(dbType);
}
public static String getDbType() {
return ((String)contextHolder.get());
}
public static void clearDbType() {
contextHolder.remove();
}
}
以上就介绍了Spring+iBatis多数据源的配置方案。本文参考eddysheng的博客:《基于spring和ibatis的多数据源切换方案》。
分享到:
相关推荐
Spring 多数据源解决方案
首先,这个方案完全是在spring的框架下解决的,数据源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource属性,它甚至都不知道dataSource的改变。 其次,实现简单,易于维护。这个方案虽然我说...
spring+hibernate解决多数据源问题3.pdf
如何在spring框架中解决多数据源的问题.pdf
实现系统对多数据源的操作。 实现系统对多数据源的分布式事务管理,包括事务的提交和回滚。
如何在spring框架中解决多数据源的问题源码
spring boot mybatis多数据源最简解决方案,说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务。
spring多数据源的处理_mybatis实现跨库查询
springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...
实现系统对多数据源的操作。 实现系统对多数据源的分布式事务管理,包括事务的提交和回滚。
项目背景: 1. Springboot项目 ... 一个主数据源,数据名称库不变。 3. 一个副数据源,数据库名称每天都在变,比如今天1号,是db_01; 明天2号,是db_02。 4.不重启项目切换数据源。 5.项目介绍: ...
下面小编就为大家带来一篇解决spring mvc 多数据源切换,不支持事务控制的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
我们将上传解决连接多个数据源部分内容的内容。 Spring版:4.2.0 mybatis版本:3.3.0 mybatis-spring版本:1.2.3 WAS:wildfly9.0.1.Final 资料库:mariaDB10.0 被使用。 并且源使用了映射器和服务,而没有...
主要给大家介绍了Spring实现动态切换多数据源的解决方案,文中给出了详细的介绍和示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考学习,下面来一起看看吧。
本篇文章主要介绍了详解利用Spring的AbstractRoutingDataSource解决多数据源的问题。具有一定的参考价值,有兴趣的可以了解一下。
下面小编就为大家带来一篇解决spring boot 1.5.4 配置多数据源的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了spring boot mybatis多数据源解决方案过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决方案 spring-boot-mybatis-annotation-mulidatasource:springboot+mybatis(注解版)多数据源最简解决方案 spring-boot-thymeleaf:simple...
spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决方案 spring-boot-mybatis-annotation-mulidatasource:springboot+mybatis(注解版)多数据源最简解决方案 spring-boot-thymeleaf:...
Ssh多数据源是个常见的问题,本人根据网上的资料,采用目前最先进的技术,经过调试解决了这个问题,可以连多个端口的多个模式的多张表。主要用到spring3的动态数据源技术,系统只有一个sessionFactory,用到某数据源...