在很多大型应用中都会对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
Figure 1 数据分割及多数据库架构
通常这种多数据源的逻辑会渗透到业务逻辑中,同时也会给我们使用的数据访问API诸如Hibernate和iBatis等带来不便(需要指定多个SessionFactory或SqlMapClient实例来对应多个DataSource)。
图片看不清楚?请点击这里查看原图(大图)。
Figure 2 多数据源的选择逻辑渗透至客户端
解决方案
图片看不清楚?请点击这里查看原图(大图)。
Figure 3 采用Proxy模式来封装数据源选择逻辑
通过采用Proxy模式我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。
Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
Spring2.x的版本中提供了实现这种方式的基本框架,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。
实例:
publicclass DynamicDataSource extends AbstractRoutingDataSource {
static Logger log = Logger.getLogger("DynamicDataSource");
@Override
protected Object determineCurrentLookupKey() {
String userId=(String)DbContextHolder.getContext();
Integer dataSourceId=getDataSourceIdByUserId(userId);
return dataSourceId;
}
}
实例中通过UserId来决定数据存放在哪个数据库中。
配置文件示例:
<bean id="dataSource" class="com.bitfone.smartdm.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.Integer">
<entry key="0" value-ref="dataSource0"/>
<entry key="1" value-ref="dataSource1"/>
<entry key="2" value-ref="dataSource2"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource0"/>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:com/bitfone/smartdm/dao/sqlmap/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="UserInfoDAO" class="com.bitfone.smartdm.dao.impl.UserInfoDAO">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
写道
Spring提供了TransactionProxyFactoryBean作为动态代理的生成工厂,该工厂产生目标bean的动态AOP事务代理。事务代理根据所配置的事务属性自动管理事务操作。该事务代理对事务的透明管理依赖于一个在ApplicationContext范围全局可见的PlatformTransactionManager。Spring提供两个默认的事务管理器实现:DataSourceTransactionManager和JtaTransactionManager。前者只能支持单个jdbc数据源,后者可以支持多个数据源,可以做分布式事务管理。一般由容器提供支持JTA的事务管理器实现,Spring的JtaTransactionManager会自动通过JNDI检测TransactionManager或UserTransaction的存在,也可以在配置中指定JNDI的设置。如果想不依赖于容器实现分布式事务管理,可以采用开源的事务管理器实现JOTM。事务管理器必须要知道被管理的DataSource的位置,如果是DataSourceTransactionManager,在事务管理器配置中直接指定JDBC数据源的引用,如果是JtaTransactionManager,容器负责告知事务管理器需要管理的数据源。不管是哪一种情况,都需要在Dao中配置与事务管理器相对应的数据源。
分享到:
相关推荐
在IT行业中,数据库是系统的核心组成部分,特别是...通过理解上述步骤和原理,开发者可以更好地设计和实施适用于各种业务场景的多数据源解决方案。在实际操作中,应根据项目需求灵活调整,以达到最佳的性能和可维护性。
"Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了系统的灵活性和可扩展性。下面我们将详细探讨如何在Spring中实现多数据源的配置及动态切换。 首先,我们...
标签中的"源码"可能指的是理解MyBatis和Spring框架内部如何处理多数据源的关键代码,这有助于我们更深入地定制和优化解决方案。"工具"可能是指像Druid、HikariCP这样的数据库连接池,它们在多数据源配置中起着至关...
如果不想使用JTA,Spring还提供了一种基于编程式事务管理的解决方案,称为PROPAGATION_REQUIRED。在这种模式下,开发者需要手动调用`TransactionTemplate`或在Service方法上使用`@Transactional`注解来开启和管理...
总的来说,Spring Boot和MyBatis的多数据源解决方案为开发者提供了一种灵活、可扩展的方式来管理和操作多个数据库,满足了复杂业务场景下的需求。通过合理的配置和设计,可以有效提升系统的稳定性和性能。
"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...
综上所述,Spring Boot通过其强大的框架能力,为开发者提供了实现多数据源操作、分布式事务管理和多线程支持的解决方案。开发者只需进行适当的配置和编码,就能在复杂的业务场景中确保数据的完整性和一致性。在实际...
"Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...
首先,这个方案完全是在spring的框架下解决的,数据源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource属性,它甚至都不知道dataSource的改变。 其次,实现简单,易于维护。这个方案虽然我说...
### 如何在Spring框架中解决多数据源的问题 #### 问题背景及挑战 在实际的软件开发过程中,尤其是在企业级应用开发中,经常会遇到需要同时处理多个数据源的情况。例如,一个应用程序可能需要同时访问Oracle数据库...
本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...
本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...
Spring Boot作为一款流行的Java框架,为开发者提供了灵活的多数据源配置方案。本文将详细介绍如何通过配置多个Mapper扫描不同的包路径来实现多数据源的配置。 #### 二、多数据源配置背景与应用场景 在Spring Boot...
综上所述,"spring-boot-easy-connection-pool-master"项目提供了一种实用的解决方案,它结合了Spring Boot的便利性和多数据源的灵活性,为大数据环境下的数据访问和管理带来了极大的便利。通过深入学习和实践该项目...
Spring Boot MyBatis 多数据源解决方案过程解析 在实际项目中,我们经常会遇到需要在一个项目中使用多个数据源的问题。例如,在迁移用户的聊天记录时,我们需要使用三个数据源。这时,我们可以使用 Spring Boot 和 ...
Spring 实现动态切换多数据源的解决方案是针对大型应用程序中数据切分的需求,通过使用多个数据库实例提升系统的可扩展性。在这样的架构中,程序需要根据请求和系统状态动态选择数据存储和读取的数据库。Spring 从 2...
Spring框架提供了一种灵活的多数据源解决方案,基于注解的方式使得数据源的切换变得简单。本文将详细介绍如何实现基于注解的多数据源配置。 首先,Spring的`AbstractRoutingDataSource`是一个关键组件,它负责根据...
请参考提供的资源文件,如`Spring Boot中使用多数据库 - JDBC.url`、`spring-boot jpa 配置两个数据源 - CSDN博客.url`以及`spring boot(七):springboot+mybatis多数据源最简解决方案 - 纯洁的微笑 - 博客园.url`,...
本文将深入探讨“多数据源事务解决方案”,以及如何在单个应用程序中使用注解来实现对多个数据库的事务管理。 首先,让我们理解什么是多数据源事务。在传统的单一数据库环境中,事务管理通常由数据库系统自身提供,...