從零開始學 Java - Spring 一主多從、多主多從 資料庫配置

来源:http://www.cnblogs.com/mafly/archive/2016/09/08/moreMaster.html
-Advertisement-
Play Games

待會蘋果要開發佈會 我寫完這篇文章就準備去看發佈會了,因為我買了好幾包瓜子和啤酒。由於蘋果的保密做的越來越差勁,該曝光的信息差不多全部曝光了,我們這種熬夜看發佈會的只不過是讓這些信息更加真實,或者說是一種習慣了吧,因為每次蘋果和錘子的發佈會都必不可少的守著電腦看。 你要問我最期待什麼新產品?可能是新 ...


待會蘋果要開發佈會

我寫完這篇文章就準備去看發佈會了,因為我買了好幾包瓜子和啤酒。由於蘋果的保密做的越來越差勁,該曝光的信息差不多全部曝光了,我們這種熬夜看發佈會的只不過是讓這些信息更加真實,或者說是一種習慣了吧,因為每次蘋果和錘子的發佈會都必不可少的守著電腦看。

你要問我最期待什麼新產品?可能是新款的 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 調用什麼的了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個幫助類只能發送簡單的基本郵件,只能發送給多個用戶,單一內容。不具有抄送功能,附件添加功能。功能代碼如下, 值得註意的是,使用QQ郵箱時,發件人密碼使用的是QQ郵箱獨立密碼 在winform程式測試有效,關於在web頁面使用,有待測試。 歡迎大家一起來和我討論C#相關知識。關註我吧! ...
  • 上篇我們介紹了Free類型可以作為一種嵌入式編程語言DSL在函數式編程中對某種特定功能需求進行描述。一個完整的應用可能會涉及多樣的關聯功能,但如果我們為每個應用都設計一套DSL的話,那麼在我們的函數式編程中將會不斷重覆的功能相似的DSL。我們應該秉承函數式編程的核心思想:函數組合(compositi ...
  • Verilog HDL的語言的運算符的範圍很廣,按照其功能大概可以分為以下幾類: (1)算術運算符 +,-,*,/,% !~ * / % + - << >> < <= > >= == !== ! & ^ ^~ | && || ?: 最高優先順序別 ↓ ↓ ↓ ↓ 最低優先順序別 (2)賦值運算符 =,< ...
  • php添加數據到xml文件中 導讀:php添加數據到xml文件中 xml文件:stu.xml: 複製代碼代碼如下: <?xml version="1.0" encoding="utf-8" ?><AllData><xueshengmen><xuesheng> <name>張三</name> <yuw ...
  • 此bug項目中使用elasticSearch中出現的,原因是,nio事件選擇器,在特性內核下以及jdk6版本中,出現不hold線程,死迴圈獲取事件的bug,導致cup使用率過高; 此bug在官網已被修複:http://bugs.java.com/bugdatabase/view_bug.do?bug ...
  • 一、H5分類 網頁開發,移動開發,移動混合開發, 二、所用知識點: APICloud:APICloud是為了開發APP的,所以如果用H5開發的移動端,需要發送簡訊,獲取照相機等就要用APICloud的了。 aui框架:aui框架就是專門開發移動端的框架。 三、怎樣用H5開發移動端? 我建議如果用H5 ...
  • .NET Getting Started with ASP.NET Core and VS Code Coding Standard Best Practices In C# Wire – Writing one of the fastest .NET serializers Other How D... ...
  • Windows下Nginx配置SSL實現Https訪問(包含證書生成) 首先要說明為什麼要實現https? HTTP全名超文本傳輸協議,客戶端據此獲取伺服器上的超文本內容。超文本內容則以HTML為主,客戶端拿到HTML內容後可根據規範進行解析呈現。因此,HTTP主要負責的是“內容的請求和獲取”。問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...