待會蘋果要開發佈會 我寫完這篇文章就準備去看發佈會了,因為我買了好幾包瓜子和啤酒。由於蘋果的保密做的越來越差勁,該曝光的信息差不多全部曝光了,我們這種熬夜看發佈會的只不過是讓這些信息更加真實,或者說是一種習慣了吧,因為每次蘋果和錘子的發佈會都必不可少的守著電腦看。 你要問我最期待什麼新產品?可能是新 ...
待會蘋果要開發佈會
我寫完這篇文章就準備去看發佈會了,因為我買了好幾包瓜子和啤酒。由於蘋果的保密做的越來越差勁,該曝光的信息差不多全部曝光了,我們這種熬夜看發佈會的只不過是讓這些信息更加真實,或者說是一種習慣了吧,因為每次蘋果和錘子的發佈會都必不可少的守著電腦看。
你要問我最期待什麼新產品?可能是新款的 MacBook Pro 吧。因為新款 iPhone 從曝光信息看攝像頭依然凸起、白帶也是存在、ID 設計依然如此,哎、蘋果在走下坡路了;由於我的筆記本是大學時期買的,到現在已經完美服役四五年了,雖然還是快的飛起,但是我就想換個新的。也不知道發了工資能不能買得起。傷感...
特麽的,看完後,發現並沒有新款的 MacBook Pro ...
廢話不多說,直接上配置
一、新建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管理 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:global.properties</value>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!--master 配置數據源 -->
<bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName">
<value>${master.jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${master.jdbc.url}</value>
</property>
<property name="username">
<value>${master.jdbc.username}</value>
</property>
<property name="password">
<value>${master.jdbc.password}</value>
</property>
...
</bean>
<!--slave 配置數據源 -->
<bean id="slaveDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName">
<value>${slave.jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${slave.jdbc.url}</value>
</property>
<property name="username">
<value>${slave.jdbc.username}</value>
</property>
<property name="password">
<value>${slave.jdbc.password}</value>
</property>
...
</bean>
<bean id="dataSource" class="cn.mayongfa.service.imp.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="slave" value-ref="slaveDataSource" />
</map>
</property>
<property name="defaultTargetDataSource" ref="masterDataSource" />
</bean>
<!-- 配置Jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
<!-- 數據源切換類 -->
<bean id="dataSourceChoose" class="cn.mayongfa.interceptor.DataSourceChoose" />
<!-- 通過AOP配置提供事務增強,讓service包下所有Bean的所有方法擁有事務 -->
...
上面配置我省略了 druid 數據連接池的一些配置和 service 層事務處理,文件並不完整,具體文件示例見GitHub:https://github.com/mafly/SpringDemo/blob/master/WebContent/WEB-INF/applicationContext.xml
如何使用阿?
我直接貼一個具體的 Service 層代碼你就完全懂了。
public interface UserBasisService {
/**
* 保存
* @param entity
* @return
*/
@DataSource
public long Save(UserBasis entity);
/**
* 刪除
* @param ID
* @return
*/
@DataSource
public Boolean Delete(long ID);
/**
* 獲取信息
* @param ID
* @return
*/
@DataSource(DataSourceType.Slave)
public UserBasis getEntity(long ID);
/**
* 根據條件獲取數據條數
* @return
*/
@DataSource(DataSourceType.Slave)
public int getListCount(Map<String, Object> whereMap);
/**
* 獲取所有
* @return
*/
@DataSource(DataSourceType.Slave)
public List<UserBasis> getList();
}
就是直接打標簽的形式切換就可以了,這裡需要註意的有兩點,也是我們曾經踩過的坑:
1.註意事務是在何處!就是說,要在一個事務開始之前做數據源的切換。
2.不要又想寫又想讀!還是在一個事務內不要有讀的方法又有寫的方法。
到這裡讀寫分離和主從動態切換數據源的配置以及使用就完整了。接下來思考:我們是不是有時候項目都是要一主多從、多主多從?
一主多從、多主多從
一主多從
的架構很多人都在使用,美其名是減小讀數據的壓力,我還是保留上一篇文章的看法,可能數據安全是最大的作用,再有就是你有數據報表和數據統計系統,使用一主多從架構可以避免生產伺服器的訪問壓力過大。
配置一主多從架構其實根據我們上面的設計就很簡單了,只需要在applicationContext.xml
文件中配置多個從庫數據源就可以,然後當你讀取從庫時,可根據你現有的從庫數來進行一些負載均衡演算法的切換,我這裡就不再演示了。
多主多從
是什麼鬼?首先我需要說明的是多主多從這裡並不是指的同一個業務資料庫,是指不同的業務資料庫,就是大家所說的「分庫分表」中的分庫,就是說我們一個項目中分出了不同的業務資料庫,然後這些不同的資料庫也可以有多個從庫,可不是一個業務資料庫有多個主庫、多個從庫,據我所知, MySql 的複製也是不建議這麼做的。
瞭解清楚概念後,我們目標就清晰了,其實根據我們的數據源切換架構,再接著配置多個數據源就可以了。其實也是這麼簡單的意思,比如:項目中有個金幣系統,用戶完成我們期望的操作就會給他相應的金幣,他可以用金幣兌換我們商城裡的物品。這時候,其實我們就應該有個金幣庫
了,不要再去和業務共用一個資料庫,所以,這時候就會用到我們「多主多從」的架構了。
寫到這裡,我看了以前開篇的從零開始學 Java - 我放棄了 .NET ? 文章目錄中沒有具體的案例,其實示例代碼都可以訪問我的 Github 看到 https://github.com/mafly/SpringDemo,我就不在寫什麼 API 調用什麼的了。