在仅使用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();
}
}
分享到:
相关推荐
Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射文件将Java对象与数据库表进行映射。这两个DTD(Document Type Definition)文件是Ibatis配置文件的定义文档,...
在Ibatis中,`sql-map`和`sql-map-config`是两个重要的XML配置文件,它们使用DTD(Document Type Definition)来定义其结构和规则。 DTD是XML文档类型定义,它定义了XML文档的合法构建块,包括元素、属性、实体等,...
sql-map-config-2.dtd
ibatis的dtd约束,版本2,xml文件中标签提示,网址:http://ibatis.apache.org/dtd/sql-map-2.dtd
配置文件中,你可以定义`<transactionManager>`来设置事务管理策略,`<dataSource>`来指定数据源,以及`<sqlMapClient>`或`<sqlMapConfig>`来包含多个SQL映射文件。此外,还可以设置全局的类型别名、对象工厂、数据...
通过本文档的学习,你可以掌握如何使用iBATIS-SqlMaps2来进行数据库操作,包括创建配置文件、定义数据源、以及编写简单的映射文件等内容。此外,本文档还简要介绍了SQLMap的基本架构和设计理念,帮助开发者更好地...
1. **创建XML配置文件**:在项目中创建一个名为`mybatis-config.xml`的文件,这是iBATIS的全局配置文件,用于定义数据源、事务管理器等。同时,也需要为每个Mapper创建单独的XML文件,如`UserMapper.xml`,其中包含...
ibatis(现在通常称为MyBatis)是一个优秀的持久层框架,它将SQL语句与Java代码分离,允许开发者直接编写SQL语句并映射到Java对象上,从而提高代码的可读性和可维护性。以下是对给定ibatis配置文件的深入分析: ###...
教程会详细解释`sqlmap-config.xml`文件的各个元素,如数据源设置、事务管理器配置等。 接下来,你会了解到SQL映射文件的编写,这是IBATIS的核心部分。在`ibatis-sqlmaps-2_cn.pdf`中,你将看到如何定义SQL语句,...
通过上述解析,我们可以看出ibatis配置文件在ibatis框架中的核心地位,它不仅定义了数据源和事务管理策略,还指定了SQL映射文件的位置,使得ibatis能够根据配置正确地执行SQL语句,完成数据库操作。
最后,我们创建了一个配置文件,该文件配置了JDBC数据源和SQL映射,这是使用ibatis SQL Maps时的重要步骤。 通过这些步骤,初学者可以快速入门ibatis SQL Maps,并开始构建基于Java的应用程序。此外,ibatis SQL ...
在多数据源场景下,可能需要根据业务需求动态地选择不同的数据库进行操作。装饰模式可以很好地解决这个问题,它可以在运行时动态地给对象增加额外的功能,而不会破坏原有的类结构。 首先,我们需要创建一个接口`...
其次,`sql-map-config-2.dtd`则是Ibatis的SQL映射配置文件的DTD,它定义了整个Ibatis系统的配置,如数据源、事务管理器、环境设置、SqlMapClient实例等。`<transactionManager>`元素定义了事务管理方式,如JDBC或...
要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-config.xml`)中添加以下设置: ```xml ``` 这里,`logImpl`设置指定了日志实现的类型,我们将其设置为"LOG4J",表示使用Log4j进行...
iBATIS-SqlMaps是Java开发中的一个持久层框架,它提供了一种将SQL语句与Java代码分离的解决方案,从而使得数据库访问更加灵活和易于维护。iBATIS的核心概念是SqlMapConfig.xml配置文件和一系列的SqlMap.xml映射文件...
### iBATIS-SqlMaps-2_ja.pdf 相关知识点 #### iBATIS Data Mapper 概览 iBATIS Data Mapper(也称为 SQL Maps)是一个开源框架,它旨在简化与关系数据库交互所需的 Java 代码量。通过使用简单的 XML 配置文件,...