`

Spring解决多数据源

 
阅读更多

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多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...

    spring+hibernate解决多数据源问题3.pdf

    本文主要介绍在Spring与Hibernate框架下解决多数据源配置的问题。在企业级应用开发中,因为业务需求的不同,往往需要同时操作多个数据库,这就需要配置多数据源来满足这样的需求。 知识点一:数据源与会话工厂 在...

    spring整合mybatis多数据源

    总的来说,Spring整合MyBatis的多数据源切换是解决复杂数据库应用场景的有效手段。通过灵活的数据源路由,我们可以轻松地实现读写分离、数据库分片等高级架构,提升系统的可扩展性和性能。理解并掌握这一技术对于...

    基于Spring多数据源实例

    在IT行业中,数据库是系统的核心组成部分,特别是...通过理解上述步骤和原理,开发者可以更好地设计和实施适用于各种业务场景的多数据源解决方案。在实际操作中,应根据项目需求灵活调整,以达到最佳的性能和可维护性。

    spring框架多数据源切换问题的解决

    首先,这个方案完全是在spring的框架下解决的,数据源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource属性,它甚至都不知道dataSource的改变。 其次,实现简单,易于维护。这个方案虽然我说...

    mybatis spring 多数据源

    标签中的"源码"可能指的是理解MyBatis和Spring框架内部如何处理多数据源的关键代码,这有助于我们更深入地定制和优化解决方案。"工具"可能是指像Druid、HikariCP这样的数据库连接池,它们在多数据源配置中起着至关...

    Spring多数据源分布式事务管理

    在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...

    如何在spring框架中解决多数据源的问题

    ### 如何在Spring框架中解决多数据源的问题 #### 问题背景及挑战 在实际的软件开发过程中,尤其是在企业级应用开发中,经常会遇到需要同时处理多个数据源的情况。例如,一个应用程序可能需要同时访问Oracle数据库...

    spring动态数据源+mybatis分库分表

    "spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...

    springboot多数据源即分布式事务解决方案

    在现代企业级应用开发中,随着业务规模的扩大和数据量的增长,往往需要处理来自多个数据源的数据。SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作...

    spring boot mybatis多数据源最简解决方案

    本文将深入探讨如何实现Spring Boot结合MyBatis的多数据源最简解决方案。 首先,我们来理解多数据源的需求。在大型分布式系统中,通常采用数据库主从复制或者分库分表策略来提高系统的可扩展性和性能。主从模式可以...

    spring多数据源动态切换方案

    "Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了系统的灵活性和可扩展性。下面我们将详细探讨如何在Spring中实现多数据源的配置及动态切换。 首先,我们...

    spring多数据源的处理_mybatis实现跨库查询

    "Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    综上所述,Spring Boot通过其强大的框架能力,为开发者提供了实现多数据源操作、分布式事务管理和多线程支持的解决方案。开发者只需进行适当的配置和编码,就能在复杂的业务场景中确保数据的完整性和一致性。在实际...

    SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置).docx

    ### Spring Boot多数据源配置详解 #### 一、引言 在实际的软件开发过程中,随着业务需求的多样化,单一的数据源已经无法满足所有场景的需求。例如,有时我们需要同时访问两个或更多的数据库来完成复杂的业务逻辑,...

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    综上所述,"spring-boot-easy-connection-pool-master"项目提供了一种实用的解决方案,它结合了Spring Boot的便利性和多数据源的灵活性,为大数据环境下的数据访问和管理带来了极大的便利。通过深入学习和实践该项目...

    springboot + mybatis(通用mapper) + HikariCP(比durid更快)多数据源

    `SpringBoot`、`MyBatis` 和 `HikariCP` 的结合是目前广泛采用的一种高效、灵活的解决方案,特别是对于处理多数据源场景。这个项目组合利用了它们各自的优势,减少了开发人员的工作量,提高了系统的性能。 首先,`...

    spring多数据源

    如何在spring框架中解决多数据源的问题源码

Global site tag (gtag.js) - Google Analytics