Обработка пакетов позволяет нам объединять в логические группы связанные 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.
В этом уроке мы изучили основы обработки пакетов и рассмотрели пример простого приложения с её использованием.
В следующем уроке мы изучим хранимые процедуры.