Spring 配置多個數(shù)據(jù)源恨闪,并實現(xiàn)動態(tài)切換

1.配置兩個不同的數(shù)據(jù)源究飞,如下(由于項目使用的是druid數(shù)據(jù)庫連接置谦,配置可以會復雜點比較):

<!-- 數(shù)據(jù)源配置1 -->

? ? <bean id="testDataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

? ? ? <property name="driverClassName" value="${db.driver}" />

? ? ? ? <property name="url" value="${unity.db.jdbc.url}" />

? ? ? <property name="username" value="${db.login.name}"></property>

? ? ? <property name="password" value="${db.login.password}" />

? ? ? <property name="filters"? value="${db.filters}"></property>

? ? ? <property name="maxActive" value="${db.pool.maxActive}"></property>

? ? ? <property name="initialSize" value="${db.pool.initialSize}"></property>

? ? ? <property name="minIdle" value="${db.pool.minIdle}"></property>

? ? ? <property name="maxWait" value="${db.maxWait}"></property>? ?

? ? ? <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"></property>

? ? ? <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"></property>

? ? ? <property name="validationQuery" value="${db.validationQuery}"></property>

? ? ? <property name="testWhileIdle" value="${db.testWhileIdle}"></property>

? ? ? <property name="testOnBorrow" value="${db.testOnBorrow}"></property>

? ? ? <property name="testOnReturn" value="${db.testOnReturn}"></property>

? ? ? <property name="poolPreparedStatements" value="${db.poolPreparedStatements}"></property>

? ? ? <property name="maxOpenPreparedStatements" value="${db.maxOpenPreparedStatements}"></property>

? ? ? <!-- 監(jiān)控數(shù)據(jù)庫 -->

? ? ? ? <property name="proxyFilters">

? ? ? ? ? ? <list>

? ? ? ? ? ? ? ? <ref bean="log-filter" />

? ? ? ? ? ? </list>

? ? ? ? </property>


? </bean>


<!-- 數(shù)據(jù)源配置2 -->

? ? <bean id="testDataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

? ? ? <property name="driverClassName" value="${db.driver}" />

? ? ? ? <property name="url" value="${pub.db.jdbc.url}" />

? ? ? <property name="username" value="${db.login.name}"></property>

? ? ? <property name="password" value="${db.login.password}" />

? ? ? <property name="filters"? value="${db.filters}"></property>

? ? ? <property name="maxActive" value="${db.pool.maxActive}"></property>

? ? ? <property name="initialSize" value="${db.pool.initialSize}"></property>

? ? ? <property name="minIdle" value="${db.pool.minIdle}"></property>

? ? ? <property name="maxWait" value="${db.maxWait}"></property>? ?

? ? ? <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"></property>

? ? ? <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"></property>

? ? ? <property name="validationQuery" value="${db.validationQuery}"></property>

? ? ? <property name="testWhileIdle" value="${db.testWhileIdle}"></property>

? ? ? <property name="testOnBorrow" value="${db.testOnBorrow}"></property>

? ? ? <property name="testOnReturn" value="${db.testOnReturn}"></property>

? ? ? <property name="poolPreparedStatements" value="${db.poolPreparedStatements}"></property>

? ? ? <property name="maxOpenPreparedStatements" value="${db.maxOpenPreparedStatements}"></property>

? ? ? <!-- 監(jiān)控數(shù)據(jù)庫 -->

? ? ? ? <property name="proxyFilters">

? ? ? ? ? ? <list>

? ? ? ? ? ? ? ? <ref bean="log-filter" />

? ? ? ? ? ? </list>

? ? ? ? </property>


? </bean>

2.定義一個類繼承AbstractRoutingDataSource實現(xiàn)determineCurrentLookupKey方法,該方法可以實現(xiàn)數(shù)據(jù)庫的動態(tài)切換亿傅,如下:

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DataSourceContextHolder.getDataSourceType();

}

}

3.定義一個可以設置當前線程的變量的工具類媒峡,用于設置對應的數(shù)據(jù)源名稱:

public class DataSourceContextHolder {

private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

/**

* @Description: 設置數(shù)據(jù)源類型

* @param dataSourceType? 數(shù)據(jù)庫類型

* @return void

* @throws

*/

public static void setDataSourceType(String dataSourceType) {

contextHolder.set(dataSourceType);

}

/**

* @Description: 獲取數(shù)據(jù)源類型

* @param

* @return String

* @throws

*/

public static String getDataSourceType() {

return contextHolder.get();

}

/**

* @Description: 清除數(shù)據(jù)源類型

* @param

* @return void

* @throws

*/

public static void clearDataSourceType() {

contextHolder.remove();

}

}

然后在spring中配置,如下:

<!-- 編寫spring 配置文件的配置多數(shù)源映射關系 -->

<bean class="com.sino.access.database.DynamicDataSource" id="dataSource">

<property name="targetDataSources">

<map key-type="java.lang.String">

<entry value-ref="testDataSource1" key="<span style="font-family: Arial, Helvetica, sans-serif;">testDataSource1</span><span style="font-family: Arial, Helvetica, sans-serif;">"></entry></span>

<entry value-ref="testDataSource2" key="testDataSource2"></entry>

</map>

</property>

<property name="defaultTargetDataSource" ref="testDataSource1">

</property>

</bean>

這樣配置兩個數(shù)據(jù)源對應的key分別為testDataSource1和testDataSource2袱蜡,默認數(shù)據(jù)庫是testDataSource丝蹭。

4.完成以上步驟后,如果沒有數(shù)據(jù)庫的事務管理,已經(jīng)可以實現(xiàn)數(shù)據(jù)庫的動態(tài)切換了奔穿。但是如果涉及到數(shù)據(jù)庫的事務管理镜沽,需要在數(shù)據(jù)庫事務開啟切換數(shù)據(jù)庫,

否則數(shù)據(jù)庫的切換只能在下次數(shù)據(jù)庫操作時才生效贱田∶遘裕可以定義一個aop處理類在數(shù)據(jù)庫事務開啟之前切換數(shù)據(jù)庫,如下:

public class DataSourceAspect implements MethodBeforeAdvice,AfterReturningAdvice

{

@Override

public void afterReturning(Object returnValue, Method method,

Object[] args, Object target) throws Throwable {

// TODO Auto-generated method stub

DataSourceContextHolder.clearDataSourceType();

}

@Override

public void before(Method method, Object[] args, Object target)

throws Throwable {

if (method.isAnnotationPresent(DataSource.class))

{

DataSource datasource = method.getAnnotation(DataSource.class);

DataSourceContextHolder.setDataSourceType(datasource.name());

}

else

{

DataSourceContextHolder.setDataSourceType(SinoConstant.DataSourceType.unityDataSource.toString());

}

}

}

5.設置數(shù)據(jù)庫事務切面和切換數(shù)據(jù)庫切面執(zhí)行的順序男摧,如下:

<aop:config>

<aop:pointcut id="transactionPointCut" expression="execution(* com.test.service.*.*(..))" />

<aop:advisor pointcut-ref="transactionPointCut"

advice-ref="txAdvice" order="2" />

<aop:advisor advice-ref="dataSourceExchange" pointcut-ref="transactionPointCut" order="1"/>

</aop:config>

利用aop的order屬性設置執(zhí)行的順序蔬墩,這樣實現(xiàn)了帶事務管理的spring數(shù)據(jù)庫動態(tài)切換。

歡迎工作一到五年的Java工程師朋友們加入Java架構開發(fā):855801563 獲取更多免費視頻教程耗拓。

合理利用自己每一分每一秒的時間來學習提升自己拇颅,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕乔询,使勁拼樟插,給未來的自己一個交代

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竿刁,隨后出現(xiàn)的幾起案子黄锤,更是在濱河造成了極大的恐慌,老刑警劉巖食拜,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸵熟,死亡現(xiàn)場離奇詭異,居然都是意外死亡负甸,警方通過查閱死者的電腦和手機流强,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惑惶,“玉大人煮盼,你說我怎么就攤上這事〈郏” “怎么了僵控?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鱼冀。 經(jīng)常有香客問我报破,道長,這世上最難降的妖魔是什么千绪? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任充易,我火速辦了婚禮,結(jié)果婚禮上荸型,老公的妹妹穿的比我還像新娘盹靴。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布稿静。 她就那樣靜靜地躺著梭冠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪改备。 梳的紋絲不亂的頭發(fā)上控漠,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音悬钳,去河邊找鬼盐捷。 笑死,一個胖子當著我的面吹牛默勾,可吹牛的內(nèi)容都是我干的碉渡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼灾测,長吁一口氣:“原來是場噩夢啊……” “哼爆价!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媳搪,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骤宣,沒想到半個月后秦爆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡憔披,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年等限,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芬膝。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡望门,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锰霜,到底是詐尸還是另有隱情筹误,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布癣缅,位于F島的核電站厨剪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏友存。R本人自食惡果不足惜祷膳,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屡立。 院中可真熱鬧直晨,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儒士,卻和暖如春的止,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背着撩。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工诅福, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拖叙。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓氓润,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薯鳍。 傳聞我的和親對象是個殘疾皇子咖气,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)挖滤,斷路器崩溪,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法斩松,內(nèi)部類的語法伶唯,繼承相關的語法,異常的語法惧盹,線程的語...
    子非魚_t_閱讀 31,599評論 18 399
  • 近日乳幸,迷上寫作,好像一個酒鬼迷上了酒钧椰。也上了一個輔導班粹断,學習如何寫爆款文字,如何成為標題黨嫡霞,如何吸引人的眼球…… ...
    紅色的魚兒閱讀 417評論 5 8
  • 致陶行知 幾載飄零苦修學瓶埋, 一朝功成誓歸國。 目華夏之瘡痍秒际, 欲救生民與水火悬赏。 不慕俗世之功名, 不羨鴻儒之談笑娄徊。...
    我知桑榆非晚閱讀 401評論 0 0
  • 有點累了
    菇?jīng)鲩L蘑菇閱讀 109評論 0 0