1. 程式人生 > >Spring 一主多從、多主多從 資料庫配置

Spring 一主多從、多主多從 資料庫配置

一、新建jdbc.properties配置檔案

  1. master.jdbc.driverClassName=com.mysql.jdbc.Driver
  2. master.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8
  3. master.jdbc.username=root
  4. master.jdbc.password=123456
  5. slave.jdbc.driverClassName=com.mysql.jdbc.Driver
  6. slave.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8
  7. slave.jdbc.username=read
  8. slave.jdbc.password=123456

配置檔案的作用大家都清楚了,是因為我們可以在applicationContext.xml檔案中以${master.jdbc.url}的形式讀取內容,配置檔案一般在/src/目錄下。

二、配置applicationContext.xml

  1. <!-- 將多個配置檔案讀取到容器中,交給Spring管理 -->
  2. <beanid="propertyConfigurer"
  3. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    >
  4. <propertyname="locations">
  5. <list>
  6. <value>classpath:global.properties</value>
  7. <value>classpath:jdbc.properties</value>
  8. </list>
  9. </property>
  10. </bean>
  11. <!--master 配置資料來源 -->
  12. <beanid="masterDataSource"class="com.alibaba.druid.pool.DruidDataSource"
  13. init-method
    ="init"destroy-method="close">
  14. <propertyname="driverClassName">
  15. <value>${master.jdbc.driverClassName}</value>
  16. </property>
  17. <propertyname="url">
  18. <value>${master.jdbc.url}</value>
  19. </property>
  20. <propertyname="username">
  21. <value>${master.jdbc.username}</value>
  22. </property>
  23. <propertyname="password">
  24. <value>${master.jdbc.password}</value>
  25. </property>
  26. ...
  27. </bean>
  28. <!--slave 配置資料來源 -->
  29. <beanid="slaveDataSource"class="com.alibaba.druid.pool.DruidDataSource"
  30. init-method="init"destroy-method="close">
  31. <propertyname="driverClassName">
  32. <value>${slave.jdbc.driverClassName}</value>
  33. </property>
  34. <propertyname="url">
  35. <value>${slave.jdbc.url}</value>
  36. </property>
  37. <propertyname="username">
  38. <value>${slave.jdbc.username}</value>
  39. </property>
  40. <propertyname="password">
  41. <value>${slave.jdbc.password}</value>
  42. </property>
  43. ...
  44. </bean>
  45. <beanid="dataSource"class="cn.mayongfa.service.imp.DynamicDataSource">
  46. <propertyname="targetDataSources">
  47. <map>
  48. <entrykey="slave"value-ref="slaveDataSource"/>
  49. </map>
  50. </property>
  51. <propertyname="defaultTargetDataSource"ref="masterDataSource"/>
  52. </bean>
  53. <!-- 配置Jdbc模板 -->
  54. <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
  55. <propertyname="dataSource"ref="dataSource"></property>
  56. </bean>
  57. <!-- 配置事務管理器 -->
  58. <beanid="transactionManager"
  59. class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  60. p:dataSource-ref="dataSource"/>
  61. <!-- 資料來源切換類 -->
  62. <beanid="dataSourceChoose"class="cn.mayongfa.interceptor.DataSourceChoose"/>
  63. <!-- 通過AOP配置提供事務增強,讓service包下所有Bean的所有方法擁有事務 -->
  64. ...

如何使用阿?

我直接貼一個具體的 Service 層程式碼你就完全懂了。

  1. publicinterfaceUserBasisService{
  2. /**
  3. * 儲存
  4. * @param entity
  5. * @return
  6. */
  7. @DataSource
  8. publiclongSave(UserBasis entity);
  9. /**
  10. * 刪除
  11. * @param ID
  12. * @return
  13. */
  14. @DataSource
  15. publicBooleanDelete(long ID);
  16. /**
  17. * 獲取資訊
  18. * @param ID
  19. * @return
  20. */
  21. @DataSource(DataSourceType.Slave)
  22. publicUserBasis getEntity(long ID);
  23. /**
  24. * 根據條件獲取資料條數
  25. * @return
  26. */
  27. @DataSource(DataSourceType.Slave)
  28. publicint getListCount(Map<String,Object> whereMap);
  29. /**
  30. * 獲取所有
  31. * @return
  32. */
  33. @DataSource(DataSourceType.Slave)
  34. publicList<UserBasis> getList();
  35. }

就是直接打標籤的形式切換就可以了,這裡需要注意的有兩點,也是我們曾經踩過的坑:
1.注意事務是在何處!就是說,要在一個事務開始之前做資料來源的切換。
2.不要又想寫又想讀!還是在一個事務內不要有讀的方法又有寫的方法。

到這裡讀寫分離和主從動態切換資料來源的配置以及使用就完整了。接下來思考:我們是不是有時候專案都是要一主多從、多主多從?

一主多從、多主多從

一主多從的架構很多人都在使用,美其名是減小讀資料的壓力,我還是保留上一篇文章的看法,可能資料安全是最大的作用,再有就是你有資料報表和資料統計系統,使用一主多從架構可以避免生產伺服器的訪問壓力過大。
配置一主多從架構其實根據我們上面的設計就很簡單了,只需要在applicationContext.xml檔案中配置多個從庫資料來源就可以,然後當你讀取從庫時,可根據你現有的從庫數來進行一些負載均衡演算法的切換,我這裡就不再演示了。

多主多從是什麼鬼?首先我需要說明的是多主多從這裡並不是指的同一個業務資料庫,是指不同的業務資料庫,就是大家所說的「分庫分表」中的分庫,就是說我們一個專案中分出了不同的業務資料庫,然後這些不同的資料庫也可以有多個從庫,可不是一個業務資料庫有多個主庫、多個從庫,據我所知, MySql 的複製也是不建議這麼做的。
瞭解清楚概念後,我們目標就清晰了,其實根據我們的資料來源切換架構,再接著配置多個數據源就可以了。其實也是這麼簡單的意思,比如:專案中有個金幣系統,使用者完成我們期望的操作就會給他相應的金幣,他可以用金幣兌換我們商城裡的物品。這時候,其實我們就應該有個金幣庫了,不要再去和業務共用一個數據庫,所以,這時候就會用到我們「多主多從」的架構了。

http://blog.mayongfa.cn/