使用Spring+MySql實現讀寫分離(二)spring整合多數據庫
緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。
1. 背景
我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說采用數據庫集群的方案,
其中一個是主庫,負責寫入數據,我們稱之為:寫庫;
其它都是從庫,負責讀取數據,我們稱之為:讀庫;
那麽,對我們的要求是:
1、 讀庫和寫庫的數據一致;
2、 寫數據必須寫到寫庫;
3、 讀數據必須到讀庫;
2. 方案
解決讀寫分離的方案有兩種:應用層解決和中間件解決。
2.1. 應用層解決:
優點:
1、 多數據源切換方便,由程序自動完成;
2、 不需要引入中間件;
3、 理論上支持任何數據庫;
缺點:
1、 由程序員完成,運維參與不到;
2、 不能做到動態增加數據源;
2.2. 中間件解決
優點:
1、 源程序不需要做任何改動就可以實現讀寫分離;
2、 動態添加數據源不需要重啟程序;
缺點:
1、 程序依賴於中間件,會導致切換數據庫變得困難;
2、 由中間件做了中轉代理,性能有所下降;
相關中間件產品使用:
mysql-proxy:http://hi.baidu.com/geshuai2008/item/0ded5389c685645f850fab07
Amoeba for MySQL:http://www.iteye.com/topic/188598
3. 使用Spring基於應用層實現(重要)
3.1. 原理
在進入Service之前,使用AOP來做出判斷,是使用寫庫還是讀庫,判斷依據可以根據方法名判斷,比如說以query、find、get等開頭的就走讀庫,其他的走寫庫。
3.2. DynamicDataSource
3.3. DynamicDataSourceHolder
3.4. DataSourceAspect
3.5. 配置2個數據源
3.5.2. 定義連接池
springmvc是子容器,spring是父容器,在父容器的applicationContext.xml配置文件中再添加新配置的數據源
3.5.3. 定義DataSource
xml中:
3.6. 配置事務管理以及動態切換數據源切面
好啦,就是這樣,算是簡單的實現,如果想優化,改進切面實現,使用事務策略規則匹配
使用Spring+MySql實現讀寫分離(二)spring整合多數據庫