`
zscomehuyue
  • 浏览: 412187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。

阅读更多
在仅使用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();
  }
}

分享到:
评论

相关推荐

    sql-map-2.dtd和sql-map-config-2.dtd

    Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射文件将Java对象与数据库表进行映射。这两个DTD(Document Type Definition)文件是Ibatis配置文件的定义文档,...

    ibatis的sql-map dtd

    在Ibatis中,`sql-map`和`sql-map-config`是两个重要的XML配置文件,它们使用DTD(Document Type Definition)来定义其结构和规则。 DTD是XML文档类型定义,它定义了XML文档的合法构建块,包括元素、属性、实体等,...

    sql-map-config-2.dtd

    sql-map-config-2.dtd

    sql-map-2.dtd

    ibatis的dtd约束,版本2,xml文件中标签提示,网址:http://ibatis.apache.org/dtd/sql-map-2.dtd

    ibatis dtd文件

    配置文件中,你可以定义`&lt;transactionManager&gt;`来设置事务管理策略,`&lt;dataSource&gt;`来指定数据源,以及`&lt;sqlMapClient&gt;`或`&lt;sqlMapConfig&gt;`来包含多个SQL映射文件。此外,还可以设置全局的类型别名、对象工厂、数据...

    iBATIS-SqlMaps2入门代码文档

    通过本文档的学习,你可以掌握如何使用iBATIS-SqlMaps2来进行数据库操作,包括创建配置文件、定义数据源、以及编写简单的映射文件等内容。此外,本文档还简要介绍了SQLMap的基本架构和设计理念,帮助开发者更好地...

    ibatis用xml配置文件配置使用

    1. **创建XML配置文件**:在项目中创建一个名为`mybatis-config.xml`的文件,这是iBATIS的全局配置文件,用于定义数据源、事务管理器等。同时,也需要为每个Mapper创建单独的XML文件,如`UserMapper.xml`,其中包含...

    ibatis配置文件

    ibatis(现在通常称为MyBatis)是一个优秀的持久层框架,它将SQL语句与Java代码分离,允许开发者直接编写SQL语句并映射到Java对象上,从而提高代码的可读性和可维护性。以下是对给定ibatis配置文件的深入分析: ###...

    ibatis-sqlmaps-2_cn

    教程会详细解释`sqlmap-config.xml`文件的各个元素,如数据源设置、事务管理器配置等。 接下来,你会了解到SQL映射文件的编写,这是IBATIS的核心部分。在`ibatis-sqlmaps-2_cn.pdf`中,你将看到如何定义SQL语句,...

    ibatis 配置文件详解

    通过上述解析,我们可以看出ibatis配置文件在ibatis框架中的核心地位,它不仅定义了数据源和事务管理策略,还指定了SQL映射文件的位置,使得ibatis能够根据配置正确地执行SQL语句,完成数据库操作。

    ibatis_sql_map教程

    最后,我们创建了一个配置文件,该文件配置了JDBC数据源和SQL映射,这是使用ibatis SQL Maps时的重要步骤。 通过这些步骤,初学者可以快速入门ibatis SQL Maps,并开始构建基于Java的应用程序。此外,ibatis SQL ...

    装饰模式 切换 ibatis 多数据源

    在多数据源场景下,可能需要根据业务需求动态地选择不同的数据库进行操作。装饰模式可以很好地解决这个问题,它可以在运行时动态地给对象增加额外的功能,而不会破坏原有的类结构。 首先,我们需要创建一个接口`...

    ibatis的dtd文件

    其次,`sql-map-config-2.dtd`则是Ibatis的SQL映射配置文件的DTD,它定义了整个Ibatis系统的配置,如数据源、事务管理器、环境设置、SqlMapClient实例等。`&lt;transactionManager&gt;`元素定义了事务管理方式,如JDBC或...

    打log4j日志-ibatis的sql输出

    要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-config.xml`)中添加以下设置: ```xml ``` 这里,`logImpl`设置指定了日志实现的类型,我们将其设置为"LOG4J",表示使用Log4j进行...

    iBATIS-SqlMaps,ibatis映射文件

    iBATIS-SqlMaps是Java开发中的一个持久层框架,它提供了一种将SQL语句与Java代码分离的解决方案,从而使得数据库访问更加灵活和易于维护。iBATIS的核心概念是SqlMapConfig.xml配置文件和一系列的SqlMap.xml映射文件...

    iBATIS-SqlMaps-2_ja.pdf

    ### iBATIS-SqlMaps-2_ja.pdf 相关知识点 #### iBATIS Data Mapper 概览 iBATIS Data Mapper(也称为 SQL Maps)是一个开源框架,它旨在简化与关系数据库交互所需的 Java 代码量。通过使用简单的 XML 配置文件,...

Global site tag (gtag.js) - Google Analytics