最近由於諮詢spring如何配置多數據源的人很多,一一回答又比較麻煩,而且以前的博文中的配置也是有問題,因此特此重新發布一個Demo給大家。
Demo中共有兩個資料來源,即MySQL和Oracle,並且已經進行簡單測試,動態切換資料來源是沒有問題的,希望藉此Demo能幫助大家。
另外我給一些說明,闡述下多資料來源配置時的重點:
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中簡單集成了一些框架,方便大家拿來就用,算是送給大家的福利,關於那些框架的配置和技術,這裡就不再闡述了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
更多Spring動態多資料來源配置相關文章請關注PHP中文網!