Hỏi đáp

Xử lý batch processing trong Spring JDBC: Hướng dẫn và ví dụ

Huy Erick

Spring JDBC là một trong những công nghệ quan trọng trong việc làm việc với cơ sở dữ liệu trong ứng dụng Java. Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử...

Spring JDBC là một trong những công nghệ quan trọng trong việc làm việc với cơ sở dữ liệu trong ứng dụng Java. Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử lý batch processing trong Spring JDBC và cung cấp một ví dụ minh họa.

Giới thiệu

Khi làm việc với cơ sở dữ liệu, chúng ta thường phải thực hiện nhiều câu truy vấn SQL. Truyền thống, mỗi câu truy vấn sẽ được thực hiện thông qua một kết nối database riêng biệt. Điều này dẫn đến việc tốn nhiều thời gian khi có nhiều bản ghi cần được thêm vào hoặc cập nhật trong cùng một thời điểm.

Batch processing là một phương pháp xử lý theo mẻ, tức là thực hiện một nhóm các câu truy vấn cùng một lúc thông qua một kết nối duy nhất. Điều này giúp tiết kiệm thời gian và tăng hiệu suất khi làm việc với cơ sở dữ liệu.

Trong ví dụ này, chúng ta sẽ sử dụng MySQL làm cơ sở dữ liệu và Eclipse cùng Maven để phát triển dự án.

Tạo cơ sở dữ liệu và bảng

Trước tiên, chúng ta cần tạo một cơ sở dữ liệu mới với bảng "user_info". Hình ảnh sau đây mô tả cấu trúc của bảng:

Tạo dự án Maven

Tiếp theo, chúng ta sẽ tạo một dự án Maven để sử dụng Spring JDBC. Bạn có thể thực hiện các bước sau:

  1. Tạo một dự án Maven mới trong Eclipse.
  2. Thêm các dependency sau vào file pom.xml:
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
  </dependency>
</dependencies>
  1. Tiến hành cấu hình database và template trong file applicationContext.xml.

Ví dụ về xử lý batch với JdbcTemplate

Trong Spring JDBC, chúng ta có nhiều cách để thực hiện xử lý batch với JdbcTemplate. Dưới đây là một số ví dụ:

Ví dụ 1: batchUpdate(String... sql)

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES ('Ronaldo', 'Bồ Đào Nha')", 
                          "INSERT INTO user_info (name, address) VALUES ('Messi', 'Argentina')");

Ví dụ 2: batchUpdate(String sql, List

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES (?, ?)", 
                         Arrays.asList(new Object[] { "Ronaldo", "Bồ Đào Nha" },
                                       new Object[] { "Messi", "Argentina" }));

Ví dụ 3: batchUpdate(String sql, List

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES (?, ?)", 
                         Arrays.asList(new Object[] { "Ronaldo", "Bồ Đào Nha" },
                                       new Object[] { "Messi", "Argentina" }), 
                         new int[] { Types.VARCHAR, Types.VARCHAR });

Ví dụ 4: batchUpdate(String sql, BatchPreparedStatementSetter pss)

final List<User> listUser = new ArrayList<User>();
listUser.add(new User("Ronaldo", "Bồ Đào Nha"));
listUser.add(new User("Messi", "Argentina"));

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES (?, ?)",
                         new BatchPreparedStatementSetter() {
                            public void setValues(PreparedStatement ps, int i) throws SQLException {
                              ps.setString(1, listUser.get(i).getName());
                              ps.setString(2, listUser.get(i).getAddress());
                            }
                            public int getBatchSize() {
                              return listUser.size();
                            }
                         });

Ví dụ 5: batchUpdate(String sql, Collection batchArgs, int batchSize, ParameterizedPreparedStatementSetter pss)

final List<User> listUser = new ArrayList<User>();
listUser.add(new User("Ronaldo", "Bồ Đào Nha"));
listUser.add(new User("Messi", "Argentina"));

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES (?, ?)",
                         listUser, listUser.size(),
                         new ParameterizedPreparedStatementSetter<User>() {
                            public void setValues(PreparedStatement ps, User user) throws SQLException {
                              ps.setString(1, user.getName());
                              ps.setString(2, user.getAddress());
                            }
                         });

So sánh hiệu suất

Chúng ta có thể so sánh hiệu suất giữa phương pháp insert thông thường và phương pháp insert sử dụng batch. Dưới đây là một ví dụ về việc insert 1000 bản ghi vào database:

List<User> listUser = init();
for (User user: listUser) {
  jdbcTemplate.update(sql, user.getName(), user.getAddress());
}

Với việc sử dụng batch, chúng ta có thể thực hiện như sau:

jdbcTemplate.batchUpdate("INSERT INTO user_info (name, address) VALUES (?, ?)", 
                         listUser, 50, 
                         new ParameterizedPreparedStatementSetter<User>() {
                            public void setValues(PreparedStatement ps, User user) throws SQLException {
                              ps.setString(1, user.getName());
                              ps.setString(2, user.getAddress());
                            }
                         });

Kết quả cho thấy việc sử dụng batch giúp tiết kiệm rất nhiều thời gian.

Kết thúc

Trên đây là một số thông tin và ví dụ về việc xử lý batch processing trong Spring JDBC. Việc sử dụng batch có thể giúp tăng hiệu suất và giảm thời gian khi làm việc với cơ sở dữ liệu.

Bạn có thể tải mã nguồn của ví dụ trên tại đây.

Nếu bạn muốn tìm hiểu thêm, hãy tham khảo tài liệu tham khảo của Spring JDBC: https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch12s04.html

Hy vọng bài viết này hữu ích cho bạn. Cảm ơn đã đọc!

1