Tags:

Batch Processing trong JDBC

Java Database Connectivity (JDBC) là một Java API dùng để tương thác với database. Khái niệm Batch processing được sinh ra nhầm mục đích nhóm một nhiều câu truy vấn trong một đơn vị và chuyển nó xuống database trong cùng một lần từ đó tăng hiệu suất của chương trình.

Ví dụ trong trường hợp chúng ta triển khai một chức năng cho phép thêm một lượng lớn dữ liệu xuống một bảng trong database. Nếu đang sử dụng JDBC thì chúng ta chỉ có 1 cách nếu không sử dụng Batch processing đó là thực thi nhiều câu INSERT tuần tự.

statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) "
 + "VALUES ('1','EmployeeName1','Designation1')"); 
statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) "
 + "VALUES ('2','EmployeeName2','Designation2')");

Việc thực thi tuần tự các câu truy vấn xuống database sẽ làm giảm hiệu suất đi đáng kể vì mỗi lần như vậy thì những câu truy vấn này sẽ phải gửi từ ứng dụng xuống database riêng lẽ từng câu một.

Bằng cách sử dụng Batch processing, chúng ta có thể nhóm các câu truy vấn này lại và gửi đi trong 1 lần duy nhất. Mặc dù lượng dữ liệu được gửi nhiều hơn, nhưng vì được gửi trong cùng một lần thì nó cũng sẽ nhanh hơn là gửi từng lần 1 riêng lẽ.

Batch processing hoạt động như thế nào?

JDBC chứa 2 class StatementPreparedStatementdùng để truy vấn dữ liệu từ database. Cả 2 class này đều chứa các method addBatch executeBatch dùng để triển khai Batch processing trong JDBC,

Batch processing – Statement

Với JDBC, cách đơn giản nhất để thực thi các truy vấn trên cơ sở dữ liệu là thông qua đối tượng Statement.

Đầu tiên, sử dụng addBatch(), chúng ta có thể thêm tất cả các truy vấn SQL vào một vùng và sau đó thực thi các truy vấn SQL đó bằng executeBatch().

Hàm executeBatch() trả về là một mảng int cho biết có bao nhiêu bản ghi được thực thi thành công.

Statement statement = connection.createStatement();
statement.addBatch("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) "
 + "VALUES ('1','EmployeeName','Designation')");
statement.addBatch("INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) "
 + "VALUES ('10','1','Address')");
statement.executeBatch();

Trong ví dụ trên, chúng ta đang thêm 1 bản ghi vào bảng EMPLOYEE và EMP_ADDRESS bằng cách sử dụng Statement. 

Batch processing – PreparedStatement

PreparedStatement là một class khác cũng cho phép thực thi các câu truy vấn cho phép sử dụng lại các câu truy vấn thông qua các tham số đầu vào.

Hãy xem một ví dụ sử dụng PreparedStatement. Trước tiên, chúng tôi thiết lập câu lệnh bằng cách sử dụng truy vấn SQL được mã hóa dưới dạng chuỗi:

String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"};
String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"};

String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) "
 + "VALUES (?,?,?)";
PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);

Tiếp theo, chúng ta lặp qua các mảng EMPLOYEES và DESIGNATIONS để triển thêm giá trị vào câu lệnh INSERT

for(int i = 0; i < EMPLOYEES.length; i++){
    String employeeId = UUID.randomUUID().toString();
    employeeStmt.setString(1,employeeId);
    employeeStmt.setString(2,EMPLOYEES[i]);
    employeeStmt.setString(3,DESIGNATIONS[i]);
    employeeStmt.addBatch();
}
employeeStmt.executeBatch();

Kết bài

Trong bài viết này, chúng ta đã thấy Batch processing quan trọng như thế nào khi tương tác với cơ sở dữ liệu bằng JDBC. Đây là một kỹ thuật được áp dụng khá nhiều trong các framework nổi tiếng như Spring, Spring Batch, Spring Boot nhầm tối ưu hiệu suất cho ứng dụng.

Nguồn

https://www.baeldung.com/jdbc-batch-processing

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x