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

Объект типа JDBC Statement позволяет выполнять пакетное обновление данных. Это может быть актуальным в случае, например, необходимости вставки большого числа данных в таблицу при выполнении импорта из внешнего источника.

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

  1. Сообщаем объекту типа Connection, что выполнять автоматический commit не требуется.
  2. Получаем объект типа Statement.
  3. Накидываем операции обновления в объект типа Statement.
  4. Выполняем пакетное обновление данных.
  5. Выполняем commit.

Пример пакетного обновления данных

В качестве примера будем использовать СУБД MySQL и созданную в этом примере таблицу users.

package ru.j4web.examples.java.jdbc.jdbcstatementbatchexample;

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

public class JDBCStatementBatchExample {

    private static final String DB_CONNECTION_STRING
            = "jdbc:mysql://dev-server:3306/sampledb";
    private static final String DB_USERNAME = "sampleuser";
    private static final String DB_PASSWORD = "samplepassword";

    public static void main(final String[] args) {
        try (Connection connection = DriverManager.getConnection(
                DB_CONNECTION_STRING, DB_USERNAME, DB_PASSWORD);
                Statement statement = connection.createStatement()) {
            connection.setAutoCommit (false);

            // Записываем данные - 10 произвольных пользователей
            String sql;
            for (int i = 1; i <= 10; i++) {
                sql = new StringBuilder("REPLACE INTO users (username, "
                        + "created_by, creation_date) VALUES ("user" + i
                        + "", "someone", "2015-11-01")").toString();
                System.out.println("Очередной запрос: " + sql);
                statement.addBatch(sql);
            }
            statement.executeBatch();
            connection.commit();

            // Проверяем результат - выводим список всех пользователей
            sql = "SELECT * FROM users";
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                System.out.println("User {user_id="
                        + resultSet.getString("user_id") + ",username="
                        + resultSet.getString("username") + ",created_by="
                        + resultSet.getString("created_by") + ",creation_date="
                        + resultSet.getString("creation_date") + "}");
            }
        } catch (SQLException ex) {
            Logger.getLogger(JDBCStatementBatchExample.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
    }
}

Результат работы программы

--- exec-maven-plugin:1.2.1:exec (default-cli) @ JDBCStatementBatchExample ---
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user1", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user2", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user3", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user4", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user5", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user6", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user7", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user8", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user9", "someone", "2015-11-01")
Очередной запрос: REPLACE INTO users (username, created_by, creation_date) VALUES ("user10", "someone", "2015-11-01")
User {user_id=4,username=user1,created_by=someone,creation_date=2015-11-01}
User {user_id=5,username=user2,created_by=someone,creation_date=2015-11-01}
User {user_id=6,username=user3,created_by=someone,creation_date=2015-11-01}
User {user_id=7,username=user4,created_by=someone,creation_date=2015-11-01}
User {user_id=8,username=user5,created_by=someone,creation_date=2015-11-01}
User {user_id=9,username=user6,created_by=someone,creation_date=2015-11-01}
User {user_id=10,username=user7,created_by=someone,creation_date=2015-11-01}
User {user_id=11,username=user8,created_by=someone,creation_date=2015-11-01}
User {user_id=12,username=user9,created_by=someone,creation_date=2015-11-01}
User {user_id=13,username=user10,created_by=someone,creation_date=2015-11-01}
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------

Зачем использовать пакетное обновление данных?

С точки зрения написание кода, использование пакетной обработки данных равносильно последовательному вызову методов Statement.executeUpdate(sql1), Statement.executeUpdate(sql2) и так далее. Однако, это не совсем так. Использование пакетной обработки данных дает существенный прирост производительности за счет меньшего числа фактически выполняемых JDBC запросов, то есть за счет уменьшения накладных расходов на выполнение каждой операции.

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

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

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

*