Batch Processing trong JDBC




Batch Processing là nhóm các lệnh có liên quan vào trong một batch và đệ trình chúng. Trong đó, các thao tác lệnh của chương trình được thực thi liên tiếp nhau mà không cần sự can thiệp của người dùng.

Việc ứng dụng Batch Processing trong cơ sở dữ liệu là rất tiện lợi. Khi bạn gửi một số lệnh SQL cùng một lúc, bạn đã giảm được chi phí thời gian giao tiếp và vì thế nâng cao được hiệu suất.

Các JDBC Driver không được yêu cầu phải nhất thiết là hỗ trợ tính năng này. Để biết xem Driver của bạn có hỗ trợ tính năng này hay không, bạn sử dụng phương thức DatabaseMetaData.supportsBatchUpdates(): trả về true là hỗ trợ và false là không.

Dưới đây là một số phương thức giúp bạn ứng dụng Batch Processing:

1. void addBatch(String sql)throws SQLException

Phương thức addBatch() của Statement được sử dụng để thêm các lệnh đơn tới batch. Tham số sql ở đây là một lệnh INSERT hoặc UPDATE.

Phương thức này không được gọi trên một đối tượng PreparedStatement và CallableStatement.

2. int[] executeBatch()throws SQLException

Phương thức executeBatch() được sử dụng để bắt đầu sự thực thi của tất cả các lệnh đã được nhóm lại với nhau này. Các phần tử trong mảng được trả về bởi phương thức này có thể là:

  • Một giá trị lớn hơn hoặc bằng 0 chỉ rằng lệnh được thực thi thành công. Và giá trị đó (gọi là update count) là số hàng trong cơ sở dữ liệu bị tác động bởi sự thực thi của lệnh.

  • Một giá trị SUCCESS_NO_INFO chỉ rằng lệnh được thực thi thành công nhưng không biết số hàng bị tác động bởi lệnh.

  • Một giá trị EXECUTE_FAILED chỉ rằng lệnh đã thực thi thất bại.

3. void clearBatch()throws SQLException

Phương thức clearBatch() được sử dụng để xóa lệnh đã thêm khỏi batch. Phương thức này xóa tất cả các lệnh trong danh sách hiện tại đã thêm vào batch.

Sử dụng Batch Processing với đối tượng Statement

Dưới đây là các bước để sử dụng Batch Processing với đối tượng Statement:

  • Tạo một đối tượng Statement bởi sử dụng phương thức createStatement().

  • Sử dụng phương thức setAutoCommit() để thiết lập chế độ auto-commit là false.

  • Thêm các lệnh SQL mà bạn muốn vào trong batch bởi sử dụng phương thức addBatch() trên đối tượng Statement đã được tạo.

  • Thực thi tất cả các lệnh trên bởi sử dụng phương thức executeBatch() trên đối tượng Statement này.

  • Cuối cùng, bạn ký thác các thay đổi với phương thức commit().

Ví dụ

Dưới đây là ví dụ về Batch Processing với đối tượng Statement trong JDBC:

package com.vietjack.jdbc; 

// Import required packages
import java.sql.*;

public class ViDuJDBC {
   // Ten cua driver va dia chi URL cua co so du lieu
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/sinhvien";

   //  Ten nguoi dung va mat khau cua co so du lieu
   static final String USER = "root";
   static final String PASS = "123456";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      // Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      // Open a connection
      System.out.println("Dang ket noi toi co so du lieu ...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      // Create statement
      System.out.println("Tao cac lenh truy van SQL ...");
      stmt = conn.createStatement();

      // Thiet lap auto-commit la false
      conn.setAutoCommit(false);

      // Dau tien, lua chon tat ca ban ghi va hien thi chung
      printRows( stmt );
  
      // Tao lenh SQL
      String SQL = "INSERT INTO sinhvienk60 (mssv, ho, ten, diemthi) " + 
                   "VALUES (4,'Hoang Manh', 'Tung', 10)";
      // Them lenh SQL tren vao trong batch.
      stmt.addBatch(SQL);

      // Tao them mot lenh SQL nua
      SQL = "INSERT INTO sinhvienk60 (mssv, ho, ten, diemthi) " +
            "VALUES (5,'Nong Duc', 'Minh', 6)";
      // Them lenh SQL tren vao trong batch.
      stmt.addBatch(SQL);

      // Tao them mot lenh SQL nua
      SQL = "UPDATE sinhvienk60 SET diemthi = 10 " +
            "WHERE mssv = 2";
      // Them lenh SQL tren vao trong batch.
      stmt.addBatch(SQL);

      // Tao mot mang int[] de giu cac gia tri tra ve
      int[] count = stmt.executeBatch();

      // Thuc thi lenh commit de ky thac cac thay doi
      conn.commit();

      // Bay gio, lua chon tat ca cac ban ghi va hien thi chung.
      printRows( stmt );

      // Don sach moi truong va giai phong resource
      stmt.close();
      conn.close();
   }catch(SQLException se){
      // Xu ly cac loi cho JDBC
      se.printStackTrace();
   }catch(Exception e){
      // Xu ly cac loi cho Class.forName
      e.printStackTrace();
   }finally{
      // Khoi finally duoc su dung de dong cac resource
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      } 
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }// Ket thuc khoi finally
   }// Ket thuc khoi try
   System.out.println("\nVietJack chuc cac ban hoc tot!");
}// Ket thuc main

public static void printRows(Statement stmt) throws SQLException{
   System.out.println("\nHien thi cac ban ghi co san ...");
   // Lua chon tat ca ban ghi va hien thi.
   String sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienk60";
   ResultSet rs = stmt.executeQuery(sql);

   while(rs.next()){
      // Lay du lieu boi su dung ten cot
      int mssv  = rs.getInt("mssv");
      int diemthi = rs.getInt("diemthi");
      String ho = rs.getString("ho");
      String ten = rs.getString("ten");

      // Hien thi cac gia tri
       System.out.print("\nMSSV: " + mssv);
       System.out.print("\nHo: " + ho);
       System.out.println("\nTen: " + ten);
       System.out.print("\nDiem Thi: " + diemthi);
       System.out.print("\n=================");
   }
   System.out.println();
   rs.close();
}// Ket thuc printRows()
}// Ket thuc ViDuJDBC

Sao chép và dán ví dụ trên trong ViDuJDBC.java, sau đó biên dịch và chạy chương trình Java trên sẽ cho kết quả:

Batch Processing trong JDBC Batch Processing trong JDBC