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