Пример использования объекта JDBC PreparedStatement — пакетное обновление

При необходимости выполнить множество однотипных запросов к базе данных использование технологии пакетного обновления данных будет хорошей идеей. Общий механизм выглядит следующим образом:

  • Мы формируем множество запросов, которые хотим выполнить. При этом после каждого запроса необходимо вызвать метод addBatch(), который фиксирует очередной запрос в последовательности.
  • Мы выполняем все ранее добавленные запросы «пачкой» с помощью вызова метода executeBatch().

Конечно, мы могли бы просто последовательно вызывать методы executeUpdate() для выполнения каждого запроса по отдельности. Но в этом случае у нас может возникнуть проблема с производительностью. Связано это с тем, что при каждом вызове метода executeUpdate() будет инициироваться новое соединение с базой данных, а эта операция требовательна к ресурсам (особенно, если приложение и СУБД физически находятся на разных машинах). Таким образом, если требуется выполнить 1000 операций вставки данных, то будет 1000 раз инициировано соединение. При использовании пакетного обновления для выполнения всей 1000 запросов соединение будет инициировано только один раз.


В данном примере мы будем использовать пакетное обновление для того, чтобы вставить множество записей в таблицу. Однако, пакетное обновление позволяет выполнять запросы на изменение данных любого типа: INSERT, UPDATE и DELETE.
package ru.j4web.examples.java.jdbc.jdbcpreparedstatementbatchexample;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JDBCPreparedStatementBatchExample {

    private static final String DB_URL = "jdbc:mysql://dev-server/sampledb"
            + "?user=sampleuser&password=samplepassword";
    private static final String INSERT_STATEMENT = "REPLACE INTO users "
            + "(username, created_by, creation_date) VALUES (?, ?, ?)";
    private static final String SELECT_STATEMENT = "SELECT user_id, username, "
            + "created_by, creation_date FROM users";

    public static void main(String[] args) {
        // Смотрим, что было в базе данных
        printUsers();
        // Выполняем пакетное обновление данных
        insertUsers();
        // Смотрим, что стало в базе данных
        printUsers();
    }

    private static void printUsers() {

        try (Connection connection = DriverManager.getConnection(DB_URL);
                PreparedStatement statement
                = connection.prepareCall(SELECT_STATEMENT)) {
            
            ResultSet result = statement.executeQuery();
            
            while(result.next()) {
                System.out.println("================================");
                Integer userId = result.getInt("user_id");
                String username = result.getString("username");
                String createdBy = result.getString("created_by");
                Date creationDate = result.getDate("creation_date");
                System.out.println("Next row: user_id = " + userId
                        + "; username = " + username + "; created_by = "
                        + createdBy + "; creation_date = " + creationDate);
            }

        } catch (SQLException ex) {
            Logger.getLogger(JDBCPreparedStatementBatchExample.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static void insertUsers() {
        
        try (Connection connection = DriverManager.getConnection(DB_URL);
                PreparedStatement statement
                = connection.prepareCall(INSERT_STATEMENT)) {
            
            for(int i = 11; i <= 20; i++) {
                
                statement.setString(1, "user_" + i);
                statement.setString(2, "j4web");
                statement.setDate(3, new Date(new java.util.Date().getTime()));
                
                statement.addBatch();
            }
            
            statement.executeBatch();
            
            System.out.println("Данные добавлены");

        } catch (SQLException ex) {
            Logger.getLogger(JDBCPreparedStatementBatchExample.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
    }
}
--- exec-maven-plugin:1.2.1:exec (default-cli) @ JDBCPreparedStatementBatchExample ---
================================
Next row: user_id = 6; username = user_6; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 7; username = user_7; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 8; username = user_8; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 9; username = user_9; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 10; username = user_10; created_by = j4web.ru; creation_date = 2016-03-02
Данные добавлены
================================
Next row: user_id = 6; username = user_6; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 7; username = user_7; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 8; username = user_8; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 9; username = user_9; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 10; username = user_10; created_by = j4web.ru; creation_date = 2016-03-02
================================
Next row: user_id = 11; username = user_11; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 12; username = user_12; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 13; username = user_13; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 14; username = user_14; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 15; username = user_15; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 16; username = user_16; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 17; username = user_17; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 18; username = user_18; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 19; username = user_19; created_by = j4web; creation_date = 2016-03-09
================================
Next row: user_id = 20; username = user_20; created_by = j4web; creation_date = 2016-03-09
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*