使用Spring AOP實現MySQL數據庫讀寫分離案例分析

一、前言

分佈式環境下數據庫的讀寫分離策略是解決數據庫讀寫性能瓶頸的一個關鍵解決方案,更是最大限度了提高了應用中讀取 (Read)數據的速度和併發量。

在進行數據庫讀寫分離的時候,我們首先要進行數據庫的主從配置,最簡單的是一臺Master和一臺Slave(大型網站系統的話,當然會很複雜,這裏只是分析了最簡單的情況)。通過主從配置主從數據庫保持了相同的數據,我們在進行讀操作的時候訪問從數據庫Slave,在進行寫操作的時候訪問主數據庫Master。這樣的話就減輕了一臺服務器的壓力。

在進行讀寫分離案例分析的時候。首先,配置數據庫的主從複製,下邊是兩種方法(任選其一即可):

1、MySQL5.6 數據庫主從(Master/Slave)同步安裝與配置詳解:

http://blog.csdn.net/xlgen157387/article/details/51331244

2、使用mysqlreplicate命令快速搭建 Mysql 主從複製:

http://blog.csdn.net/xlgen157387/article/details/52452394

當然,只是簡單的爲了看一下如何用代碼的方式實現數據庫的讀寫分離,完全不必要去配置主從數據庫,只需要兩臺安裝了 相同數據庫的機器就可以了。

二、實現讀寫分離的兩種方法

具體到開發中,實現讀寫分離常用的有兩種方式:

1、第一種方式是我們最常用的方式,就是定義2個數據庫連接,一個是MasterDataSource,另一個是SlaveDataSource。更新數據時我們讀取MasterDataSource,查詢數據時我們讀取SlaveDataSource。這種方式很簡單,我就不贅述了。

2、第二種方式動態數據源切換,就是在程序運行時,把數據源動態織入到程序中,從而選擇讀取主庫還是從庫。主要使用的技術是:Annotation,Spring AOP ,反射。

下面會詳細的介紹實現方式。

三、Aop實現主從數據庫的讀寫分離案例

1、項目代碼地址

目前該Demo的項目地址在開源中國 碼雲 上邊:http://git.oschina.net/xuliugen/aop-choose-db-demo

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

或者CSDN免費下載:

http://download.csdn.net/detail/u010870518/9724872

2、項目結構

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

上圖中,除了標記的代碼,其他的主要是配置代碼和業務代碼。

3、具體分析

該項目是SSM框架的一個demo,Spring、Spring MVC和MyBatis,具體的配置文件不在過多介紹。

(1)UserContoller模擬讀寫數據

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

模擬讀寫數據,調用IUserService 。

(2)spring-db.xml讀寫數據源配置

<bean id="statFilter" class="com.alibaba.druid.filter.stat.StatFilter" lazy-init="true">

<property name="logSlowSql" value="true"/>

<property name="mergeSql" value="true"/>

</bean>

<!-- 數據庫連接 -->

<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource"

destroy-method="close" init-method="init" lazy-init="true">

<property name="driverClassName" value="${driver}"/>

<property name="url" value="${url1}"/>

<property name="username" value="root"/>

<property name="password" value="${password}"/>

<!-- 省略部分內容 -->

</bean>

<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource"

destroy-method="close" init-method="init" lazy-init="true">

<property name="driverClassName" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="root"/>

<property name="password" value="${password}"/>

<!-- 省略部分內容 -->

</bean>

<!-- 配置動態分配的讀寫 數據源 -->

<bean id="dataSource" class="com.xuliugen.choosedb.demo.aspect.ChooseDataSource" lazy-init="true">

<property name="targetDataSources">

<map key-type="java.lang.String" value-type="javax.sql.DataSource">

<!-- write -->

<entry key="write" value-ref="writeDataSource"/>

<!-- read -->

<entry key="read" value-ref="readDataSource"/>

</map>

</property>

<property name="defaultTargetDataSource" ref="writeDataSource"/>

<property name="methodType">

<map key-type="java.lang.String">

<!-- read -->

<entry key="read" value=",get,select,count,list,query"/>

<!-- write -->

<entry key="write" value=",add,create,update,delete,remove,"/>

</map>

</property>

</bean>

</beans>

上述配置中,配置了readDataSource和writeDataSource兩個數據源,但是交給SqlSessionFactoryBean進行管理的只有dataSource,其中使用到了:com.xuliugen.choosedb.demo.aspect.ChooseDataSource 這個是進行數據庫選擇的。

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

(3)ChooseDataSource

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

(4)DataSourceAspect進行具體方法的AOP攔截

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

(5)DataSourceHandler,數據源的Handler類

使用Spring AOP實現MySQL數據庫讀寫分離案例分析

主要代碼,如上所述。具體細節可以下載代碼查看。


原文:http://www.toutiao.com/i6370888340224344578


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章