Руководство по JDBC. Обработка пакетов.

Обработка пакетов позволяет нам объединять в логические группы связанные SQL-запросы и посылать их одним “пакетом” в базу данных (далее – БД).
Когда мы отправляем несколько SQL-запросов в БД вместе, мы уменьшаем количество взаимодействий с БД, тем самым увеличивая производительность.

Для использования этой функции нам необходимо использовать метод DatabaseMetaData.supportBatchUpdates(). Этот метод возвращает true, если наш JDBC драйвер поддерживает данную функцию.

Интерфейсы Statement, PrepparedStatement и CallableStatement имеют метод addBatch(), который используется для того, чтобы добавить отдельный SQL-запрос в “пакет”. Метод executeBatch() используется для выполнения всех запросов, которые находятся в данном пакете. Этот метод возвращает массив целых чисел, каждый элемент которого представляет количество изменений для каждого запроса редактирования (update).

После того, как мы добавили запросы в пакет, мы можем удалить их используя метод clearBatch(). Этот метод удаляет все запросы, которые были добавлены в “пакет”. Мы не имеем возможности удалять отдельные запросы из группы.

Для того, чтобы создать пакет, нам необходимо:

  • Создать экземпляр Statemnet, PreparedStatement, либо CallableStatement с помощью соответствующих методов.
  • Отключить функцию auto-commit, установив false в метод setAutoCommit().
  • Добавить необходимое количество SQL-запросов в “пакет” с помощью метода addBatch().
  • Выполнить все SQL-запросы в группе, используя метод executeBatch().
  • Сохранить изменения с помощью метода commit().

Для понимания того, как это работает на практике, рассмотрим пример простого приложения с использованием экземпляра Statement.

Пример:


import java.sql.*;

public class BatchingProcessingDemo {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DATABASE_URL = "jdbc:mysql://localhost/PROSELYTE_TUTORIALS";

    static final String USER = "ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ";
    static final String PASSWORD = "ВАШ_ПАРОЛЬ";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection connection = null;
        Statement statement = null;

        Class.forName(JDBC_DRIVER);
        connection = DriverManager.getConnection(DATABASE_URL, USER, PASSWORD);
        connection.setAutoCommit(false);

        statement = connection.createStatement();

        String SQL = "SELECT * FROM developers";
        ResultSet resultSet = statement.executeQuery(SQL);


        System.out.println("Initial developer's table content:");
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");

            if (name == null) {
                System.out.println("Table is empty.");
                break;
            }
            String specialty = resultSet.getString("specialty");
            int salary = resultSet.getInt("salary");

            System.out.println("\n====================");
            System.out.println("id: " + id);
            System.out.println("Name: " + name);
            System.out.println("Specialty: " + specialty);
            System.out.println("Salary : $" + salary);
            System.out.println("====================\n");
        }

        SQL = "INSERT INTO developers VALUES (1, 'Proselyte', 'Java', 3000)";
        statement.addBatch(SQL);
        SQL = "INSERT INTO developers VALUES (2, 'AsyaSmile', 'UI/UX', 2500)";
        statement.addBatch(SQL);
        SQL = "INSERT INTO developers VALUES (3, 'Peter', 'C++', 3000)";
        statement.addBatch(SQL);

        try {


            statement.executeBatch();
            connection.commit();

            SQL = "SELECT * FROM developers";
            resultSet = statement.executeQuery(SQL);

            System.out.println("Final developer's table content:");
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String specialty = resultSet.getString("specialty");
                int salary = resultSet.getInt("salary");

                System.out.println("\n====================");
                System.out.println("id: " + id);
                System.out.println("Name: " + name);
                System.out.println("Specialty: " + specialty);
                System.out.println("Salary : $" + salary);
                System.out.println("====================\n");
            }

            resultSet.close();
            statement.close();
            connection.close();
        } finally {
            if (statement != null) {
                statement.close();
            }

            if (connection != null) {
                connection.close();
            }
        }

        System.out.println("Thank You.");
    }
}

В результате работы программы мы получим следующий результат:


/*Some System Messages*/

Initial developer's table content:
Final developer's table content:

====================
id: 1
Name: Proselyte
Specialty: Java
Salary : $3000
====================


====================
id: 2
Name: AsyaSmile
Specialty: UI/UX
Salary : $2500
====================


====================
id: 3
Name: Peter
Specialty: C++
Salary : $3000
====================

Thank You.

В этом уроке мы изучили основы обработки пакетов и рассмотрели пример простого приложения с её использованием.

В следующем уроке мы изучим хранимые процедуры.