1. 配置多个数据源spring
这里以两个c3p0数据库链接池的数据源做为实例。在Spring框架下使用c3p0的数据库须要加入c3p0-0.9.1.2.jar(如今最新的)这个支持包。这里以数据同步项目为例:sql
数据来源库的链接池数据源配置:数据库
数据插入库的链接池数据源配置:安全
注意:上面url,user,password等值是从classpath下的jdbc.properties中取得的。session
经过Spring获取属性文件中的值,以供配置文件使用:app
2. 扩展Spring的AbstractRoutingDataSource抽象类,实现动态数据源。框架
AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是实现数据源的route的核心.这里对该方法进行Override。xss
上下文DbContextHolder为一线程安全的ThreadLocal,具体代码以下:ide
3.配置动态数据源ui
将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。
4.使用动态数据源
例子中DynamicDataSource是继承与AbstractRoutingDataSource,而AbstractRoutingDataSource又是继承于org.springframework.jdbc.datasource.AbstractDataSource,AbstractDataSource实现了统一的DataSource接口,因此DynamicDataSource一样能够当一个DataSource使用。
在Spring的JdbcTemplate使用动态数据源的配置示例:
在ORM框架Hibernate中的使用配置示例:
5.事务管理
使用动态数据源的时候,能够看出和使用单数据源的时候相比,在使用配置上几乎没有差异,在进行性事务管理配置的时候也没有差异:
使用Spring的JdbcTemplate的事务管理配置示例:
使用Hibernate时的事务管理配置示例:
6.动态数据源的管理控制
如何选择控制每一个业务中须要的具体数据源,但是使用手动控制:
也能够采用AOP的控制方式:
7.总结
经过扩展Spring的AbstractRoutingDataSource能够很好的实现多数据源的rout效果,并且对扩展更多的数据源有良好的伸缩性,只要增长数据源和修改DynamicDataSource的targetDataSources属性配置就好。在数据源选择控制上,能够采用手动控制(业务逻辑并很少的时候),也能够很好的用AOP的@Aspect在Service的入口加入一个切面@Pointcut,在@Before里判断JoinPoint的类容选定特定的数据源。