MyBatis多數據源配置(讀寫分離)mysql
首先說明,本文的配置使用的最直接的方式,實際用起來可能會很麻煩。spring
實際應用中可能存在多種結合的狀況,你能夠理解本文的含義,不要死板的使用。sql
一般是MySql一主多從的狀況,本文的例子就是主從的狀況,可是隻有兩個數據源,因此採用直接配置不會太麻煩,可是不利於後續擴展,主要是做爲一個例子來講明,實際操做請慎重考慮。數據庫
針對這種狀況,一個更好的解決方法能夠參考(本人沒有實際嘗試過):express
http://blog.csdn.net/lixiucheng005/article/details/17391857api
還有一個經過SpringAbstractRoutingDataSource
路由接口的方式:微信
當業務獨立性強,數據量大的時候的,爲了提升併發,可能會對錶進行分庫,分庫後,每個數據庫都須要配置一個數據源。併發
這種狀況能夠參考本文,可是須要注意每個數據庫對應的Mapper要在不一樣的包下方便區分和配置。app
另外分庫的狀況下也會存在主從的狀況,若是你的數據庫從庫過多,就參考上面提供的方法,或者尋找其餘方式解決。
分庫的狀況下,不一樣的數據庫的Mapper必定放在不一樣的包下。
主從的狀況下,同一個Mapper會同時存在讀寫的狀況,建立兩個並不合適,使用同一個便可。可是這種狀況下須要注意,Spring對Mapper自動生成的名字是相同的,並且類型也相同,這是就不能直接注入Mapper
接口。須要經過SqlSession
來解決。
applicationContext.xml
這個文件,主要是引入了spring-datasource-master.xml
和spring-datasource-slave.xml
。
spring-datasource-master.xml
spring-datasource-slave.xml
和master
區別不大,主要是id
名字和數據源配置有區別。
這裏須要注意<tx:method name="*" read-only="true"/>
是隻讀的。若是不是從庫,能夠按主庫進行配置。
在下面代碼中:
必須經過sqlSessionFactoryBeanName
來指定不一樣的sqlSessionFactory
。
config.properties
這裏是針對主從的狀況進行設置的,兩個配置掃描的Mapper
是同樣的,因此無法直接注入,須要經過下面的麻煩方式注入。
由於sqlSession
能經過name
區分開,因此這裏從sqlSession
獲取Mapper
。
另外若是須要考慮在同一個事務中寫讀的時候,須要使用相同的writeMapper
,這樣在讀的時候,才能獲取事務中的最新數據。
以上是主從的狀況。
在分庫的狀況時,因爲不一樣Mapper在不一樣的包下,因此能夠直接使用@Resource
或者@Autowired
注入Mapper
,不須要經過sqlSession
獲取。
本篇文章,只是一個多數據源的參考,實際應用時,請根據本身的狀況進行考慮。
後續,我會利用業餘時間,在本文和上面兩個相關連接的基礎上,針對MySql多數據源,嘗試開發能夠自動切換數據源的插件,由於我對這方面的實際應用不是很熟,因此歡迎你們留言分享本身的解決方案,對這些瞭解的越多,就越有可能開發出通用的數據源切換插件。