本文目錄一覽:
北大青鳥java培訓:springbatch批處理框架的簡介?
批處理任務是大多數IT項目的一個重要組成部分,批處理在業務系統中負責處理海量的數據,無須人工干預就能夠自動高效的進行複雜的數據分析和處理。
批處理會定期讀入批量數據,經過相應的業務處理進行歸檔的業務操作,批處理的特徵是自動執行,處理的數據量大,定時執行。
將整個批處理的流程按邏輯劃分可以分為讀數據,處理數據和寫數據。
以下是整理的springbatch框架的簡介知識,希望能幫助到大家。
springbatch對批處理本身的特性進行了抽象,將批處理作業抽象為job和jobstep,將批處理的處理過程分解為數據讀,數據處理和數據寫。
將異常處理機制分為跳過,重啟和重試。
將作業的分區分為多線程,並行遠程和分區。
springbatch不是一個調度框架,但需要調度框架來配合完成批處理任務,它只關注批處理相關的任務問題,但沒有提供相應的調度功能,如果需要使用調度功能,需要使用調度框架,這裡介紹一個比較常用的調度框架quartz,可以配合springbatch完成批處理的任務調度。
springbatch的架構分為三層:基礎架構層,核心層和應用層。
應用層包含所有的批處理作業,核心層主要提供JobLauncher、Job和step,基礎架構層主要提供通用的讀(ItemReader)、寫(ItemWriter)和服務處理(如:RetryTemplate重試模板;RepeatTemplate:重複模板),Springbatch的三層架構體系使得Springbatch框架可以在不同的層級進行擴展,避免不同層級之間的相互影響。
job的介紹批處理的作業是由一組step組成,同時job本身也是配置文件的頂級元素。
每個作業都有自己的名字,可以定義step的執行順序,以及定義作業是否可以重啟。
job執行的時候會生成一個jobinstance(作業實例)和一個jobexecution(作業執行器)。
jobinstance包含執行job期間產生的數據以及job執行的狀態信息;1個job可以對應多個jobinstance,1個jobinstance可以對應多個jobexecution。
job的配置的主要屬性有id(作業的唯一標識)、job-repository(定義作業倉庫)、incrementer(作業參數遞增器)、restartable(作業是否重啟)、parent(指定該作業的父作業)、abstract(定義作業是否抽象)。
step的介紹step表示作業中一個完整的步驟,一個job可以由一個或者多個step組成,step主要負責批處理運行過程中的主要業務邏輯的實現。
河北電腦培訓認為每次step執行的時候會生成一個或者多個jobexecution,每次任務執行失敗的時候,等到下次重新執行該任務的時候就會為該任務的step重新生成一個stepexecution。
java編程 批處理
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Stack;
public class CheckFilebatch {
private static final String LOG_FILE = “F:/CheckFilebatch.log”; //報錯的信息寫在這個文件里。
private static final String FILE_HOME = “F:/niceStore /”; //要操作的物理目錄
public static void main(String[] args) {
try {
ArrayListString fileListInDB = new ArrayListString();
FileWriter fw = new FileWriter(LOG_FILE);
// TODO
// 取得DB連接,執行sql“SELECT DISTINCT FILEPATH FROM ARR-FILE”,得到一個ResultSet
// 從DB中取出文件信息,放入fileListInDB 中,
ResultSet rs = null;
while (rs.next()) {
String path = rs.getString(“File_Column”);
File f = new File(path);
if (!f.exists()) {
// 不合法的報出錯誤信息。
System.out.println(“file not exists: ” + path);
fw.write(“file not exists: ” + path + “\n”);
} else {
// 合法的,轉化為路徑名的規範路徑名字符串,加入到fileListInDB中
fileListInDB.add(f.getCanonicalPath());
}
}
rs.close();
//
fw.write(“\n\n\n\n”);
//下面開始遍歷物理目錄
File home = new File(FILE_HOME);
StackFile tmpStack = new StackFile();
tmpStack.add(home);
while (!tmpStack.isEmpty()) {
File tmp = tmpStack.pop();
File[] childs = tmp.listFiles();
for (int i = 0; i childs.length; i++) {
File child = childs[i];
if (child.isDirectory()) {
tmpStack.push(child);
} else {
if (fileListInDB.contains(child.getCanonicalPath())) {
fileListInDB.remove(child.getCanonicalPath());
} else {
// 刪除文件。
child.delete();
// 這裡的操作如果把它移動到另一個目錄里,作為備份,更好些。
fw.write(“delete file: ” + child.getCanonicalPath());
}
}
}
}
// 這個程序只考慮文件,不考慮目錄
fw.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
JAVA如何實現數據庫的批處理操作
批量數據進入數據庫使用addBatch()和executeBatch()方法
PreparedStatement.addBatch(); …… PreparedStatement.executeBatch();需要注意的是一次最多不要超過50條:1.因為插入的時候數據庫已經鎖定,然而若是一次性插入太多會造成其他業務的等待。2.會造成內存的溢出
舉例:
PreparedStatement pst = (PreparedStatement) con.prepareStatement(“insert into ***** values (?,’***’)”); for (int i = 0; i 10000; i++) { pst.setInt(1, i); // 把一個SQL命令加入命令列表 pst.addBatch(); } // 執行批量更新 pst.executeBatch(); // 語句執行完畢,提交本事務 con.commit();
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/288938.html