Spring 一主多從、多主多從 資料庫配置
一、新建jdbc.properties
配置檔案
master.jdbc.driverClassName=com.mysql.jdbc.Driver
master.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8
master.jdbc.username=root
master.jdbc.password=123456
slave.jdbc.driverClassName=com.mysql.jdbc.Driver
slave.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8
slave.jdbc.username=read
slave.jdbc.password=123456
配置檔案的作用大家都清楚了,是因為我們可以在applicationContext.xml
檔案中以${master.jdbc.url}
的形式讀取內容,配置檔案一般在/src/
目錄下。
二、配置applicationContext.xml
<!-- 將多個配置檔案讀取到容器中,交給Spring管理 -->
<beanid="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
<propertyname="locations">
<list>
<value>classpath:global.properties</value>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!--master 配置資料來源 -->
<beanid="masterDataSource"class="com.alibaba.druid.pool.DruidDataSource"
init-method
<propertyname="driverClassName">
<value>${master.jdbc.driverClassName}</value>
</property>
<propertyname="url">
<value>${master.jdbc.url}</value>
</property>
<propertyname="username">
<value>${master.jdbc.username}</value>
</property>
<propertyname="password">
<value>${master.jdbc.password}</value>
</property>
...
</bean>
<!--slave 配置資料來源 -->
<beanid="slaveDataSource"class="com.alibaba.druid.pool.DruidDataSource"
init-method="init"destroy-method="close">
<propertyname="driverClassName">
<value>${slave.jdbc.driverClassName}</value>
</property>
<propertyname="url">
<value>${slave.jdbc.url}</value>
</property>
<propertyname="username">
<value>${slave.jdbc.username}</value>
</property>
<propertyname="password">
<value>${slave.jdbc.password}</value>
</property>
...
</bean>
<beanid="dataSource"class="cn.mayongfa.service.imp.DynamicDataSource">
<propertyname="targetDataSources">
<map>
<entrykey="slave"value-ref="slaveDataSource"/>
</map>
</property>
<propertyname="defaultTargetDataSource"ref="masterDataSource"/>
</bean>
<!-- 配置Jdbc模板 -->
<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource"ref="dataSource"></property>
</bean>
<!-- 配置事務管理器 -->
<beanid="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 資料來源切換類 -->
<beanid="dataSourceChoose"class="cn.mayongfa.interceptor.DataSourceChoose"/>
<!-- 通過AOP配置提供事務增強,讓service包下所有Bean的所有方法擁有事務 -->
...
如何使用阿?
我直接貼一個具體的 Service 層程式碼你就完全懂了。
publicinterfaceUserBasisService{
/**
* 儲存
* @param entity
* @return
*/
@DataSource
publiclongSave(UserBasis entity);
/**
* 刪除
* @param ID
* @return
*/
@DataSource
publicBooleanDelete(long ID);
/**
* 獲取資訊
* @param ID
* @return
*/
@DataSource(DataSourceType.Slave)
publicUserBasis getEntity(long ID);
/**
* 根據條件獲取資料條數
* @return
*/
@DataSource(DataSourceType.Slave)
publicint getListCount(Map<String,Object> whereMap);
/**
* 獲取所有
* @return
*/
@DataSource(DataSourceType.Slave)
publicList<UserBasis> getList();
}
就是直接打標籤的形式切換就可以了,這裡需要注意的有兩點,也是我們曾經踩過的坑:
1.注意事務是在何處!就是說,要在一個事務開始之前做資料來源的切換。
2.不要又想寫又想讀!還是在一個事務內不要有讀的方法又有寫的方法。
到這裡讀寫分離和主從動態切換資料來源的配置以及使用就完整了。接下來思考:我們是不是有時候專案都是要一主多從、多主多從?
一主多從、多主多從
一主多從
的架構很多人都在使用,美其名是減小讀資料的壓力,我還是保留上一篇文章的看法,可能資料安全是最大的作用,再有就是你有資料報表和資料統計系統,使用一主多從架構可以避免生產伺服器的訪問壓力過大。
配置一主多從架構其實根據我們上面的設計就很簡單了,只需要在applicationContext.xml
檔案中配置多個從庫資料來源就可以,然後當你讀取從庫時,可根據你現有的從庫數來進行一些負載均衡演算法的切換,我這裡就不再演示了。
多主多從
是什麼鬼?首先我需要說明的是多主多從這裡並不是指的同一個業務資料庫,是指不同的業務資料庫,就是大家所說的「分庫分表」中的分庫,就是說我們一個專案中分出了不同的業務資料庫,然後這些不同的資料庫也可以有多個從庫,可不是一個業務資料庫有多個主庫、多個從庫,據我所知,
MySql 的複製也是不建議這麼做的。
瞭解清楚概念後,我們目標就清晰了,其實根據我們的資料來源切換架構,再接著配置多個數據源就可以了。其實也是這麼簡單的意思,比如:專案中有個金幣系統,使用者完成我們期望的操作就會給他相應的金幣,他可以用金幣兌換我們商城裡的物品。這時候,其實我們就應該有個金幣庫
了,不要再去和業務共用一個數據庫,所以,這時候就會用到我們「多主多從」的架構了。
http://blog.mayongfa.cn/