spring mysql 读写分离_如何利用Spring实现数据库读写分离?
現在大型的電子商務系統,在數據庫層面大都采用讀寫分離技術,就是一個Master數據庫,多個Slave數據庫。Master庫負責數據更新和實時數據查詢,Slave庫當然負責非實時數據查詢。因為在實際的應用中,數據庫都是讀多寫少(讀取數據的頻率高,更新數據的頻率相對較少),而讀取數據通常耗時比較長,占用數據庫服務器的CPU較多,從而影響用戶體驗。我們通常的做法就是把查詢從主庫中抽取出來,采用多個從庫,使用負載均衡,減輕每個從庫的查詢壓力。
采用讀寫分離技術的目標:有效減輕Master庫的壓力,又可以把用戶查詢數據的請求分發到不同的Slave庫,從而保證系統的健壯性。我們看下采用讀寫分離的背景。
隨著網站的業務不斷擴展,數據不斷增加,用戶越來越多,數據庫的壓力也就越來越大,采用傳統的方式,比如:數據庫或者SQL的優化基本已達不到要求,這個時候可以采用讀寫分離的策略來改變現狀。
具體到開發中,如何方便的實現讀寫分離呢?目前常用的有兩種方式:
1.第一種方式是我們最常用的方式,就是定義2個數據庫連接,一個是MasterDataSource,另一個是SlaveDataSource。更新數據時我們讀取MasterDataSource,查詢數據時我們讀取SlaveDataSource。這種方式很簡單,我就不贅述了。
2.第二種方式動態數據源切換,就是在程序運行時,把數據源動態織入到程序中,從而選擇讀取主庫還是從庫。主要使用的技術是:annotation,SpringAOP,反射。
借助于spring框架在2.0.1之后提供的AbstractRoutingDataSource可以實現動態的選擇數據源datasource,下面先舉一個最簡單的例子:
一、首先新建一個CatalogVO對象的DAO(見代碼1),它繼承了SimpleJdbcDaoSupport,JdbcDaoSupport需要注入一個DataSource,同時也提供了操作模板JdbcTemplate。添加一個方法用于獲取所有的“貨物Item”。貨物Iteam是一個POJO類(見代碼2)
代碼1:
代碼2:
二、配置Spring多數據源,這里配置了一個主庫和一個從庫,他們可以共同繼承一個父的數據源。
代碼3:
三、新建一個datasource繼承自AbstractRoutingDataSource,并且覆蓋determineCurrentLookupKey()方法,每次用這個datasource獲取數據庫連接的時候都會回調這個方法獲得key,根據返回的字符串key(也可以是枚舉值,數字類型),動態地通過datasource配置的id來在Spring的配置文件中找到相應的datasource來獲取connection(見代碼4)。那么如果每次訪問都需要根據key來決定如何選擇數據源,那么這個key必須要保證線程安全,并發情況下每個線程都會去尋找本應該屬于自己的key獲取數據源,所以CustomerContextHolder類中就用到了ThreadLocal來保證(見代碼5)。
代碼4:
代碼5:
在Spring中的配置如下:
代碼6:
四、測試用例
代碼7:
為了方便測試,另外定義了2個數據庫,shop模擬Master庫,test模擬Slave庫,shop和test的表結構一致,但數據不同,數據庫配置如下:
在spring的配置中增加aop配置
下面是MyBatis的UserMapper的定義,為了方便測試,登錄讀取的是Master庫,用戶列表讀取Slave庫:
好了,運行我們的Eclipse看看效果,輸入用戶名admin登錄看看效果
從圖中可以看出,登錄的用戶和用戶列表的數據是不同的,也驗證了我們的實現,登錄讀取Master庫,用戶列表讀取Slave庫。
小編結語:
更多內容盡在課課家教育~~
總結
以上是生活随笔為你收集整理的spring mysql 读写分离_如何利用Spring实现数据库读写分离?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用窗口_如何调用一个函数并
- 下一篇: linux cmake编译源码,linu