當前位置:編程學習大全網 - 源碼下載 - 15《Spring Boot 入門教程》多數據源與分布式事務

15《Spring Boot 入門教程》多數據源與分布式事務

壹個項目中使用多個數據源的需求,我們在日常工作中時常會遇到。

以商城系統為例,有壹個 MySQL 的數據庫負責存儲交易數據。公司還有壹套 ERP 企業信息化管理系統,要求訂單信息同步錄入 ERP 數據庫,便於公司統壹管理,而該 ERP 系統采用的數據庫為 SQL Server 。

此時,就可以在 Spring Boot 項目中配置多個數據源。另外,使用多數據源後,需要采用分布式事務來保持數據的完整性。

本小節我們使用 Spring Boot 開發壹個商城系統的訂單生成功能,訂單信息同時進入 MySQL 與 SQL Server 數據庫。

首先創建 MySQL 數據庫 shop ,並新建訂單表 order ,表結構如下:

order 表結構

然後創建 SQL Server 數據庫 erpshop ,並新建訂單表 erp_order ,表結構如下。註意 id 是自增長的唯壹標識,out_id 是對應訂單在 MySQL 數據庫中的唯壹標識,以便在兩個庫中比對訂單。

erp_order 結構

接下來,我們開始實現 Spring Boot 後端項目,數據持久層采用 MyBatis 框架,同時訪問兩個數據源。

Spring Boot 版本選擇 2.2.5 ,Group 為 com.imooc , Artifact 為 spring-boot-multidb,生成項目後導入 Eclipse 開發環境。

我們引入熱部署依賴、 Web 依賴、數據庫訪問相關依賴及測試相關依賴,具體如下:

實例:

由於我們要同時訪問兩個數據庫,所以需要在配置文件中添加兩個數據源的配置信息。註意配置多數據源時, url 配置需要使用 spring.datasource.db1.jdbc-url=xxx 的形式。

實例:

多個數據源的情況下, 我們需要通過配置類,將數據源註冊為組件放入 Spring 容器中。

實例:

通過這個配置類, Spring 容器中就有兩個數據源組件,這兩個組件分別采用 spring.datasource.db1 和 spring.datasource.db2 開頭的配置信息。所以通過這兩個組件,就能分別操作 MySQL 數據源 1 和 SQL Sever 數據源 2 。

多數據源情況下, MyBatis 中的關鍵組件 SqlSessionFactory 和 SqlSessionTemplate 也需要單獨配置,我們需要為兩個數據源分別配置壹套組件。

實例:

通過上面的配置類, com.imooc.springbootmultidb.mapper1 包中的 DAO 數據訪問接口會自動調用 sqlSessionTemplate1 組件實現具體數據庫操作,而 sqlSessionTemplate1 操作的數據源已經通過配置類設置為 db1 。同時, DAO 數據訪問接口對應的映射文件已經指定到 classpath:mapper1/ 目錄去尋找。這樣數據源 – DAO 數據訪問接口 – 映射文件三者的對應關系就建立起來了。

數據源 2 的配置方法是壹樣的, com.imooc.springbootmultidb.mapper2 包中的 DAO 數據訪問接口會自動調用 sqlSessionTemplate2 組件,其操作的數據源即為 db2 ,其對應的映射文件指定到 classpath:mapper2/ 目錄去尋找。

實例:

數據訪問接口的位置已經在配置類指定,首先在 com.imooc.springbootmultidb.mapper1 創建 OrderDao ,操作的是數據源 1 中的 order 表。

實例:

然後在 com.imooc.springbootmultidb.mapper2 創建 ErpOrderDao ,操作的是數據源 2 中的 erporder 表。

實例:

這兩個接口中使用的數據對象比較簡單,代碼如下:

實例:

分別針對 OrderDao 、 ErpOrderDao 編寫對應的映射文件,然後按照配置類指定的位置,兩個文件分別放到 resources/mapper1 和 resources/mapper2 目錄下。

實例:

實例:

數據操作接口與對應的映射文件均已編寫完畢,現在可以通過測試類進行多數據源測試了,我們在測試類中同時向兩個庫插入記錄。

實例:

運行測試方法後,兩個數據庫表中均新增數據成功,這樣我們就成功的使用 Spring Boot 同時操作了兩個數據源。

采用多數據源之後,事務的實現方式也隨之發生變化。當某個數據源操作出現異常時,該數據源和其他數據源的事務都需要回滾。這種涉及多個數據源的事務,稱為分布式事務,接來下我們就來具體實現壹下。

在 pom.xml 引入 Atomikos 事務管理器相關的依賴項, Atomikos 是壹個開源的事務管理器,支持分布式事務。

實例:

需要將默認的數據源更換為支持分布式事務的數據源, MySQL 對應的數據源為 MysqlXADataSource , SQL Server 對應的數據源為 SQLServerXADataSource 。

實例:

繼續修改 DataSourceConfig 類,在其中配置分布式事務管理器組件。當項目中使用事務時,會通過配置的分布式事務管理器管理分布式事務操作。

實例:

在測試方法上添加 @Transactional 開啟事務,然後在兩個數據源操作中間模擬拋出異常。

實例:

此時運行測試類,可以發現數據源 1 的事務已回滾,驗證成功!

在開發 Spring Boot 項目時,如果默認配置滿足不了我們的需求,可以通過手工配置組件實現我們需要的功能。這些組件可能是各個公司提供的,我們根據相應文檔,為其配置各個屬性即可。

  • 上一篇:PHP如何取得數組的上標和下標
  • 下一篇:源代碼是明亮的白色
  • copyright 2024編程學習大全網