天天看點

SSH架構支援多資料源

我們可能需要在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對應的資料源。