首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring多数据源的配备

2012-08-29 
Spring多数据源的配置在大型的应用中,为了提高数据库的水平伸缩性,对多个数据库实例进行管理,需要配置多数

Spring多数据源的配置
在大型的应用中,为了提高数据库的水平伸缩性,对多个数据库实例进行管理,需要配置多数据源。在Spring框架被广泛运用的今天,可以很简单的运用Spring中的特性配置动态多数据。

1. 首先配置一个基于c3p0.ComboPooledDataSource的数据源A
daoContext.xml



2. 接着增加一个数据源B
daoContext.xml


3. 接着扩展一个Spring提供的AbstractRoutingDataSource,Override 其中的 determineCurrentLookupKey方法实现数据源的route.


4. 如何是用这个动态的多数据源呢? 其实很简单,因为我们的DynamicDataSource 是继承与AbstractRoutingDataSource,而AbstractRoutingDataSource又是继承于org.springframework.jdbc.datasource.AbstractDataSource,显然的AbstractDataSource实现了统一的DataSource接口,所以我们的DynamicDataSource 同样可以方便的当一个DataSource使用,下面拿Hibernate做例子:

可以看到我们用的仍然是一个sessionFactory,这样看来事务管理的配置也和以前一样。

DynamicDataSource Bean也在容器中了,现在剩下的就在程序中如何控制,选择某一个想要的数据源该怎么做:
package datasource;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;@Aspectpublic class DynamicDataSourceAspect {@Pointcut("execution (public service.impl..*.*(..))")public void serviceExecution(){}@Before("serviceExecution()")public void setDynamicDataSource(JoinPoint jp) {for(Object o : jp.getArgs()) {//处理具体的逻辑 ,根据具体的境况CustomerContextHolder.setCustomerType()选取DataSource}}}


5. 总结: 我们可以看到运用AbstractRoutingDataSource可以很好的实现多数据源的,而且以后扩展更多的数据源时也非常容易,只要增加数据源和修改DynamicDataSource Bean的targetDataSources 配置就好。关于选择某一个数据源,其实可以很好的用@Aspect在Service的入口加入一个切面@Pointcut,在@Before里判断JoinPoint的类容选定特定的数据源(例如更加JoinPoint的某个key来判断在设置CustomerContextHolder.setCustomerType)。
根究实际的应用来确定。个人看法: 以前有很多应用部署了writeDataSource和readDataSource和slaveDataBase的实现,但现在的大部分应用在构架上已经不太适合了,越来越注重和用户的交互性使得数据库间他同步变得日益复杂和难以维护,所以在架构系统时不妨考虑使用水平切割的方法来切割数据库,当然这种开发需要需要更多的时间分析业务领域,选取如何的配置数据源其实也是和业务息息相关的。

热点排行