对这个贴的补充:
动态切换多数据源
引用
2。在有多个数据源的时候,需要为每个数据源生成一个 beanfactory 。这个目前可能无法通过 spring 提供的 servlet 来自动实现,需要自己手工来操作。这些 beanfactory 使用同样的 spring xml 配置文件,但是使用不同的数据库配置文件。
对应每一个数据源,在程序启动的时候生成一个 factory ,然后可以为每个 factory 和数据源标识对应起来保存在 hashmap 之类的列表中,以方便后面使用。
3。如果使用 webwork,web 层的 action 不能再在 spring 的配置文件中出现了。在 web 层的 action 里面都实现一个 BeanFactoryAware 的 Interface 。再写一个 interceptor 来为 action 做 IoC 的操作,这个 BeanFactoryAware 可以根本不需要有任何方法,只是作为一个标识接口就可以了。
interceptor 的代码类似
public class RegistryInterceptor implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
if( invocation.getAction() instanceof BeanFactoryAware ) {
Map session = invocation.getInvocationContext().getSession();
Registry.getInstance().getContext( session.get( "dsKey" ) )
.getBeanFactory().autowireBeanProperties( invocation.getAction(),
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false );
}
}
}
package test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
public final class Registry {
static Registry instance = new Registry();
public static Registry getInstance() {
return instance;
}
private Map contextMap;
private Registry() {
contextMap = new HashMap();
}
public Object getBean( final String dsKey, final String beanName ) {
AbstractApplicationContext context =
(AbstractApplicationContext)contextMap.get( dsKey );
if( null != context ) {
return context.getBean( beanName );
} else {
return null;
}
}
public AbstractApplicationContext getContext( final String dsKey ) {
return (AbstractApplicationContext)contextMap.get( dsKey );
}
public void init( Map dsPropertiesMap, String [] contextFiles ) throws Exception {
Iterator iter = dsPropertiesMap.keySet().iterator();
while( iter.hasNext() ) {
String dsKey = (String)iter.next();
String [] propertiesFiles = (String[])dsPropertiesMap.get( dsKey );
Properties allProps = new Properties();
for( int i = 0; i < propertiesFiles.length; i++ ) {
Properties props = new Properties();
props.load( new FileInputStream( propertiesFiles[i] ) );
allProps.putAll( props );
}
PropertyPlaceholderConfigurer configurer =
new PropertyPlaceholderConfigurer();
configurer.setProperties( allProps );
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext( contextFiles, false );
context.addBeanFactoryPostProcessor( configurer );
context.refresh();
contextMap.put( dsKey, context );
}
}
}
package test;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import java.util.Map;
import java.util.HashMap;
import test.Registry;
class UserService {
UserService(){}
// omit other useful methods
}
class UserAction {
UserService userService;
UserAction() {}
void setUserService( UserService userService ) {
userService = userService;
}
// omit other useful methods
}
public class TestRegistry {
static public void main( String [] args ) throws Exception {
Map propertiesMap = new HashMap();
propertiesMap.put( "ds1",
new String[] { "database1.properties", "common.properties" } );
propertiesMap.put( "ds2",
new String[] { "database2.properties", "common.properties" } );
Registry.getInstance().init( propertiesMap,
new String[] { "ApplicationContext.xml", "DataAccessContext.xml" } );
UserAction action = new UserAction();
Registry.getInstance().getContext( "ds1" ).getBeanFactory()
.autowireBeanProperties( action,
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
UserService service =
(UserService)Registry.getInstance().getBean( "ds2", "UserService" );
}
}
分享到:
- 2007-03-20 10:52
- 浏览 10378
- 评论(0)
- 论坛回复 / 浏览 (0 / 3972)
- 查看更多
相关推荐
Spring多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...
在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-easy-connection-pool-master"项目提供了一种实用的解决方案,它结合了Spring Boot的便利性和多数据源的灵活性,为大数据环境下的数据访问和管理带来了极大的便利。通过深入学习和实践该项目...
Spring Boot作为一款流行的Java框架,为开发者提供了灵活的多数据源配置方案。本文将详细介绍如何通过配置多个Mapper扫描不同的包路径来实现多数据源的配置。 #### 二、多数据源配置背景与应用场景 在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`,...
本文将深入探讨“多数据源事务解决方案”,以及如何在单个应用程序中使用注解来实现对多个数据库的事务管理。 首先,让我们理解什么是多数据源事务。在传统的单一数据库环境中,事务管理通常由数据库系统自身提供,...