14/08/2018, 11:02

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ố ...

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à:

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:

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("
code24h chuc cac ban hoc tot!");
}// Ket thuc main

public static void printRows(Statement stmt) throws SQLException{
   System.out.println("
Hien 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("
MSSV: " + mssv);
       System.out.print("
Ho: " + ho);
       System.out.println("
Ten: " + ten);
       System.out.print("
Diem Thi: " + diemthi);
       System.out.print("
=================");
   }
   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 JDBCBatch Processing trong JDBC

0