最近由于咨詢spring如何配置多數(shù)據(jù)源的人很多,一一回答又比較麻煩,而且以前的博文中的配置也是有問(wèn)題,因此特此重新發(fā)布一個(gè)Demo給大家。
Demo中共有兩個(gè)數(shù)據(jù)源,即MySQL和Oracle,并已經(jīng)進(jìn)行簡(jiǎn)單測(cè)試,動(dòng)態(tài)切換數(shù)據(jù)源是沒有問(wèn)題的,希望借此Demo能幫助到大家。
Demo下載地址:
Spring動(dòng)態(tài)切換多數(shù)據(jù)源Demo:dynamicDatasourceDemo.rar
另外我給些說(shuō)明,闡述下多數(shù)據(jù)源配置時(shí)的重點(diǎn):
1. 注意事務(wù)攔截器的配置
這是首要的一條。首先你要明白,Spring的事務(wù)管理是與數(shù)據(jù)源綁定的,一旦程序執(zhí)行到事務(wù)管理的那一層(如service)的話,由于在進(jìn)入該層之前事務(wù)已經(jīng)通過(guò)攔截器開啟,因此在該層切換數(shù)據(jù)源是不行的,明白事務(wù)的原理是尤為重要的,我之前的文章中,將切換數(shù)據(jù)源的攔截器配置在了Dao層是有問(wèn)題的(因?yàn)槭鞘纠源中牧耍瑢?duì)誤導(dǎo)了大家我表示道歉),但提供的思路是沒有問(wèn)題的。
Demo中將切換數(shù)據(jù)源的攔截器(dataSourceInterceptor)配置在了事務(wù)攔截器(txadvice)的上一層,也就是Controller層。
2. 注意數(shù)據(jù)庫(kù)表的創(chuàng)建
一些人喜歡用hibernate的自動(dòng)創(chuàng)建表的功能,但需要注意,在多數(shù)據(jù)源中,尤其是不同數(shù)據(jù)庫(kù)的多數(shù)據(jù)源,想都自動(dòng)建表是不行的。因?yàn)镠ibernate自動(dòng)建表是在項(xiàng)目啟動(dòng)時(shí)觸發(fā)的,因此只會(huì)建立項(xiàng)目配置的默認(rèn)數(shù)據(jù)源的表,而其他數(shù)據(jù)源的表則不會(huì)自動(dòng)創(chuàng)建。大家要注意著點(diǎn)。
3. Hibernate的數(shù)據(jù)庫(kù)方言(dialect)可以忽略
在多數(shù)據(jù)源時(shí),方言的設(shè)置可以忽略,Hibernate在使用時(shí)會(huì)自動(dòng)識(shí)別不同的數(shù)據(jù)庫(kù),因此不必糾結(jié)這個(gè)配置,甚至不配置也可以。
4. 報(bào)No current session錯(cuò)誤
這個(gè)是因?yàn)槭褂昧藄essionFactory.getCurrentSession()導(dǎo)致的,current session是與線程綁定的,一個(gè)線程只會(huì)開啟一個(gè)Session(除非使用openSession()就不會(huì)報(bào)錯(cuò)),因此需要設(shè)置session與線程的綁定關(guān)系。
Demo中使用了Spring管理Hibernate的session,因此在web.xml中配置了OpenSessionInViewFilter,并在hibernate.cfg.xml中配置了current_session_context_class。【PS:使用Spring管理Hibernate時(shí),可以去掉hibernate.cfg.xml,而全部配置的Spring的配置文件里,即hibernateProperties。看個(gè)人喜好吧】
最后,Demo中簡(jiǎn)單集成了一些框架,方便大家拿來(lái)就用,算是送給大家的福利,關(guān)于那些框架的配置和技術(shù),這里就不再闡述了。想要了解的可以看一下地址:
spring多數(shù)據(jù)源配置:http://www.jfrwli.cn/article/87800.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/wangpeng047/article/details/43450189