我們可能需要在Java EE項目中用到多資料源,不同的功能通路不同的資料庫。具體怎麼做呢?
[size=x-large]1.資料源的定義部分:[/size] 在spring的配置檔案中增加如下配置:
<jee:jndi-lookup id="ds1" jndi-name="MainDataSource" />
<jee:jndi-lookup id="ds2" jndi-name="DataCenterSource" />
<!-- 多資料源映射 -->
<bean id="dataSource" class="com.example.db.DynamicDataSource">
<property name="targetDataSources">
<map key-type="com.example.db.DataSourceType">
<entry key="SP" value-ref="ds1" />
<entry key="DC" value-ref="ds2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="ds1" />
</bean>
上面這段配置如何了解呢? 首先我們定義了兩個資料源ds1和但是ds2,他們對應的jndi-name分别為MainDataSource,DataCenterSource(我們可以在中間件或tomcat的連結池中定義他們的jndi-name);然後将這兩個資料源綁定到一個動态資料源切換的dataSource上,并且ds1和ds2對應的調用key為SP和DC,同時,預設的資料源為ds1。
代碼在執行的時候,指定的資料源為dataSource,通過傳入的key來實作資料源的切換。
[size=x-large]2.DynamicDataSource的實作[/size]
DynamicDataSource繼承自spring的動态資料源路由
并重寫其中的determineCurrentLookupKey方法。根據你的需要來切換資料源。
我們這裡采用的是通過線程變量來給key賦予不同的值。
[size=x-large]3.動态資料源的使用[/size]
預設情況下,如果不指定對應的參數,将會使用預設的資料源MainDataSource。
可以通過下面的方式指定其他的資料源:
DBContextHolder.setDataBase("DC");
那麼在該線程中執行的後續操作的資料源将會使用DC對應的資料源。