1. 程式人生 > >使用Spring+MySql實現讀寫分離(二)spring整合多數據庫

使用Spring+MySql實現讀寫分離(二)spring整合多數據庫

ont 依據 xml配置 實現 整合 配置 item 匹配 mic

緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。

1. 背景

我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說采用數據庫集群的方案,

其中一個是主庫,負責寫入數據,我們稱之為:庫;

其它都是從庫,負責讀取數據,我們稱之為:庫;

那麽,對我們的要求是:

1、 讀庫和寫庫的數據一致;

2、 寫數據必須寫到寫庫;

3、 讀數據必須到讀庫;

2. 方案

解決讀寫分離的方案有兩種:應用層解決和中間件解決。

2.1. 應用層解決:

技術分享圖片

優點:

1、 多數據源切換方便,程序自動完成;

2、 不需要引入中間件;

3、 理論上支持任何數據庫;

缺點:

1、 程序員完成,運維參與不到;

2、 不能做到動態增加數據源;

2.2. 中間件解決

技術分享圖片

優點:

1、 源程序不需要做任何改動就可以實現讀寫分離;

2、 動態添加數據源不需要重啟程序;

缺點:

1、 程序依賴於中間件,會導致切換數據庫變得困難;

2、 由中間件做了中轉代理,性能有所下降;

相關中間件產品使用:

mysql-proxyhttp://hi.baidu.com/geshuai2008/item/0ded5389c685645f850fab07

Amoeba for MySQLhttp://www.iteye.com/topic/188598

http://www.iteye.com/topic/1113437

3. 使用Spring基於應用層實現(重要

3.1. 原理

技術分享圖片

在進入Service之前,使用AOP來做出判斷,是使用寫庫還是讀庫,判斷依據可以根據方法名判斷,比如說以queryfind、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整合多數據庫