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的類容選定特定的數據源。