Spring動態多資料來源例項Demo
最近由於諮詢Spring如何配置多資料來源的人很多,一一回答又比較麻煩,而且以前的博文中的配置也是有問題,因此特此重新發佈一個Demo給大家。
Demo中共有兩個資料來源,即Mysql和Oracle,並已經進行簡單測試,動態切換資料來源是沒有問題的,希望藉此Demo能幫助到大家。
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中簡單集成了一些框架,方便大家拿來就用,算是送給大家的福利,關於那些框架的配置和技術,這裡就不再闡述了。大家如果還有什麼問題,可以給我留言,我有時間的話,會積極回覆大家的疑問的。