SpringBatch從入門到放棄011- 一個典型的資料庫分片處理的例子

2021-01-11 鵬哥歪說
Spring Batch

今天鵬哥帶大家了解一下分區Step,按照鵬哥的套路,上來第一步肯定是一個例子,然後是例子的講解,最後是源碼分析為什麼會這樣設置。這樣才是由淺入深的學習一個知識點正確的套路。所以今天鵬哥帶給大家的是一個Step分區的例子。這是一個典型的資料庫分區處理的例子,如果你只想使用一下資料庫分區功能,看這個例子就足夠了。

程序猿最討厭沒有需求的例子,其實是因為不想費腦子想需求。哈哈,這個例子我們來假想有這麼一個需求:資料庫有100條記錄,我們分5片去處理它,也就是每片20條。同時Reader是分頁讀,每頁讀3條,設置chunkSize = 5,也就是每5條事務提交一次。好了,完美的需求,再次偷笑。既然有需求了,那我們就按部就班去實現這個需求吧。

Step 1: 創建一個Spring Batch 的工程

當然首先還是需要先創建一個Spring Batch 的工程,這裡鵬哥就不浪費了筆墨了,看這篇文章就好了。參考[SpringBatch從入門到放棄001- HelloWorld]。

Step 2: 定義我們的分片規則

回憶我們的需求,資料庫有100條記錄,需要分5片執行,怎麼個分法?這裡就需要對這100條記錄的數據結構有一定的了解了。因為鵬哥自己的建的測試數據,所以鵬哥知道這是一個ID連續的100條記錄,因此只要按照ID分就可以了。我們取ID最大值和最小值,將兩者相減就得到了總記錄數,將這個數字除以5,就可以得到每一片的數據集大小,當然這裡一眼就能看出來是20,鵬哥只是想模擬更真實的場景。

新建一個類,取名DbPartitioner 實現 Partitioner接口。Override partition()方法。方法的入參是需要分的片數,出參是每一片執行時的上下文。鵬哥在代碼裡面加了詳細的注釋,可以看下邊的代碼就可以了。

Step 3:定義Reader/Processor/Writer

我們使用JdbcPagingItemReader 作為我們分頁讀的Reader,按照ID排序,並設置PageSize=3。這裡跟之前不同的是我們傳入了兩個參數,這兩個參數就是第一步Partitioner中我們放到ExecutionContext中的值,因為Reader我們添加了@StepScope註解,所以我們可以在這裡直接注入這兩個值。

因為沒有其他要求,我們簡單定義Processor/Writer就好了。

Step 4 為了清晰的能看到每一片執行的數據和線程信息,我們定義了一個StepExecutionListener

之前鵬哥介紹過Listener的使用,這裡就不做過多地展開。參考[SpringBatch從入門到放棄004- Listener]。我們新建一個StepExecutionPartitionListener類,在beforeStep() 中列印當前線程名稱、當前Step 名稱和當前Step ExecutionContext 中的參數值,這個值會被注入到Reader中。

Step 5: 新建一個需要分片的Step

定義一個簡單的Step ,設置了Chunk信息,Reader/Processor/Writer以及綁定上一步定義的Listener。

Step 6: 新建一個PartitionHandler

這個才是這個例子的核心,我們定義了一個TaskExecutorPartitionHandler,並設置了線程池和需要分片的Step,最重要的是我們設置了GridSize ,這個值就是我們需要分的片數。設置5 就是分5片。

Step 7: 定義被Partitioner包裝的Step

我們定義一個PartitionStep用於包裝我們上邊定義的那個簡單Step,這個PartitionStep裡面我們設置了我們前邊定義的分片規則和分片之後的Handler。後邊組裝Job的時候使用的是這個PartitionStep。

Step 8:組裝一個Job

我們在第7步中,定義了一個包裝過的PartitionStep,這裡我們用這個Step 組裝一個Job。

Step 9:構建測試數據

我們新建了一個Junit ,這個測試類的目的是為了構建我們的測試數據,定一個JdbcTemplate ,並利用JdbcTemplate.batchUpdate() 方法批量的往測試資料庫中插入100條記錄,為了演示方便我們資料庫ID欄位設置了自增。

Step 10: 定義Junit 測試Job

這一步我們利用Spring Batch 4.0的新特性,構建一個Junit的測試類。如果你不知道@SpringBatchTest 有什麼用,不要著急,你先按照鵬哥的方式使用就好了,鵬哥會在後續文章中分享關於 Spring Batch 4.0裡面的新特性的。

Step 11: 分析測試結果

根據列印的日誌首先我們看到我們的系統幫我們起了5個線程,每個線程執行一個分片 Step,並輸出了每片裡面的參數。

同時我們在Writer 裡面也列印出來了當前的線程名稱和需要Writer的數據,我們通過日誌可以看出,輸出是亂序的,這樣進一步佐證了分片是多線程並發執行。

好了,這個資料庫分片執行的例子已經寫完了,因為排版問題,鵬哥統一使用了圖片,有需要源碼的朋友可以關注鵬哥,發私信找鵬哥要源碼。

相關焦點

  • SpringBatch從入門到放棄001- HelloWorld
    SpringBatch從入門到放棄001- HelloWorld經常有人問我,有沒有一個 Spring Batch 的例子可以參考一下,之前的我的回答一般是百度自己找,太多了。但是後來我發現因為 Spring Batch的版本太穩定,網上的例子大部分都是基於2.X,3.X版本的,還有就是對應的 Spring Boot 的版本也是比較老的。
  • SpringBatch從入門到放棄002- 核心概念1
    Spring -batchSpringBatch從入門到放棄002- 核心概念1上一篇我們通過一個例子簡單介紹了一下 Spring Batch,讓大家有個簡答的概念,今天我們來看 Spring batch 裡面具體的概念。
  • Spring Batch 入門教程
    默認情況下, SpringBatch使用資料庫存儲已配置的批處理作業上的元數據。在本例中,我們不直接使用資料庫,而是使用基於內存映射的 Map,運行 SpringBatch。spring-boot-starter-batch starter依賴於 spring-boot-starter-jdbc,並將嘗試實例化數據源。
  • 通過例子講解Spring Batch入門,優秀的批處理框架
    2.2.3 任務JobJob是封裝整個批處理過程的單位,跑一個批處理任務,就是跑一個Job所定義的內容。2.2.5 輸入——處理——輸出所以,定義一個Job關鍵是定義好一個或多個Step,然後把它們組裝好即可。而定義Step有多種方法,但有一種常用的模型就是輸入——處理——輸出,即Item Reader、Item Processor和Item Writer。
  • Spring Batch真是個優秀的批處理框架,用完愛不釋手!
    2 Spring Batch的概念知識2.1 分層架構Spring Batch的分層架構圖如下:通過例子講解Spring Batch入門,優秀的批處理框架可以看到它分為三層,分別是:Application應用層:包含了所有任務batch jobs和開發人員自定義的代碼,主要是根據項目需要開發的業務流程等
  • Spring Batch 批處理框架技巧
    引入依賴首先我們需要引入對Spring Batch的依賴,在pom.xml文件加入下面的代碼:<dependency>    <groupId>org.springframework.batch</groupId>    <artifactId>spring-batch-core
  • 一文輕鬆搞定批處理框架 Spring Batch
    Spring Batch 不僅提供了統一的讀寫接口、豐富的任務處理方式、靈活的事務管理及並發處理,同時還支持日誌、監控、任務重啟與跳過等特性,大大簡化了批處理應用開發,將開發人員從複雜的任務配置管理過程中解放出來,使他們可以更多地去關注核心的業務處理過程。  另外我們還需要知道,Spring Batch 是一款批處理應用框架,不是調度框架。
  • Spring Batch 4.3.0-M2 發布,批處理應用編寫框架
    Spring Batch 提供了一個名為 spring.batch.job.active 的度量,該度量給出了當前活動作業的數量。但是直到現在該指標仍無法讓用戶知道當前正在激活哪些特定作業。此版本豐富了度量標準標籤以實現此目標。3.
  • Spring Batch 4.1.0.RC1,用於編寫批處理應用的框架
    Spring Batch 是一個使用 Spring 和 Java 編寫離線和批處理應用程式的框架。更新內容在這個版本中,開發團隊主要致力於使 Spring Batch 可在 Java 8,9,10 和 11 上正確構建和運行。
  • SpringBatch組合寫,複雜業務邏輯批處理必備
    ,java批處理新規範JSR-352即是受其深度影響。但是其官方提供的API在實際運用中還是收到了挑戰,比如在實際場景中一個任務(Step)會更新多張表,而SpringBatch官方提供的API一個Step只能更新一張表。
  • 分庫分表【Sharding-JDBC】入門與項目實戰
    邏輯表水平拆分的資料庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為 10 張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。真實表在分片的資料庫中真實存在的物理表。即上個示例中的t_order_0到t_order_9。數據節點數據分片的最小單元。
  • Spring JDBC訪問關係型資料庫
    其中的步驟可以抽象為:對於上述步驟,實際上很多部分都是通用的——即對於每一次資料庫訪問都沒有變化,例如定義參數、打開連接、處理異常、事務處理、資源釋放。完全沒有必要再每一次訪問裡都編寫這些代碼,一種辦法是將這些代碼封裝起來。
  • 一文快速入門分庫分表中間件 Sharding-JDBC(必修課)
    從最開始 Sharding-JDBC 1.0 版本只有數據分片,到 Sharding-JDBC 2.0 版本開始支持資料庫治理(註冊中心、配置中心等等),再到 Sharding-JDBC 3.0版本又加分布式事務 (支持 Atomikos、Narayana、Bitronix、Seata),如今已經迭代到了 Sharding-JDBC 4.0 版本。
  • 深入淺出 spring-data-elasticsearch 之 ElasticSearch 架構初探(一)
    分片包括主分片和副分片,主分片是副分片的拷貝。主分片和副分片地工作基本沒有大的區別。在索引中全文搜索,然後會查詢到每個分片,將每個分配的結果進行全局地收集處理,並返回。二、Elasticsearch 工作原理2.1 文檔存儲的路由當索引到一個文檔(如:報價系統),具體的文檔數據(如:報價數據)會存儲到一個分片。
  • 數據量大了一定要分表,分庫分表Sharding-JDBC入門與項目實戰
    邏輯表水平拆分的資料庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。真實表在分片的資料庫中真實存在的物理表。即上個示例中的t_order_0到t_order_9。
  • 使用Spring Cloud Data Flow 來實現數據流處理
    確實有這樣的一個框架,那就是Spring Cloud Data Flow(SCDF),相對於大名鼎鼎的Spring Boot和Spring Cloud,在國內大家可能還不太熟悉SCDF,今天我們就給大家介紹一下。
  • 如何使用 Spring 對資料庫進行 CURD?
    --連接資料庫的ur1 --><propertyname="url"value="jdbc:mysql://localhost:3306/spring_db" /><!資料庫的訪問地址,如上所示,jdbc:mysql://localhost:3306/spring_db 中的localhost 為你的資料庫地址 3306 為資料庫的連接斷開,斜槓後面的spring_db 表示需要連接的資料庫名稱;username 資料庫的用戶名;password 資料庫的密碼
  • SpringSecurity + JWT,從入門到精通!
    用戶和角色是多對一的關係,即一個用戶只充當一種角色,一個角色可以有多個角色的擔當。用戶和角色是多對多的關係,即,一個用戶可以同時充當多個角色,一個角色可以有多個用戶。此系統功能單一,人員較少,這裡舉個慄子,張三既是行政,也負責財務,此時張三就有倆個權限,分別是行政權限,和財務權限兩個部分。
  • executeBatch()該如何運用?關於 executeBatch() 的詳解用法
    executeBatch()詳解JDBC提供了資料庫batch處理的能力,在數據大批量操作(新增、刪除等)的情況下可以大幅度提升系統的性能。禁用自動執行使得應用程式能夠在發生錯誤及批處理中的某些命令不能執行時決定是否執行事務處理。因此,當進行批處理更新時,通常應該關閉自動執行。在JDBC 2.0 中,Statement 對象能夠記住可以一起提交執行的命令列表。創建語句時,與它關聯的命令列表為空。Statement.addBatch() 方法為調用語句的命令列表添加一個元素。
  • spring security 整合 springboot 入門案例
    序言前面我們學習了 spring security 與 springmvc 的整合入門教程。這一節我們來學習一下 spring security 與 springboot 整合,為了力求簡單,此處不演示資料庫相關操作。