Другий спосіб - трохи ефективніший, але набагато кращий спосіб - виконувати їх партіями:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
}
statement.executeBatch();
}
}
Однак ви залежать від реалізації драйвера JDBC, скільки пакетів ви можете виконати одночасно. Наприклад, ви можете виконати їх кожні 1000 партій:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
int i = 0;
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
i++;
if (i % 1000 == 0 || i == entities.size()) {
statement.executeBatch(); // Execute every 1000 items.
}
}
}
}
Що стосується багатопоточних середовищ, вам не потрібно турбуватися про це, якщо ви набуваєте та закриваєте з'єднання та оператор у найкоротшій можливості в межах того самого блоку методу відповідно до звичайної ідіоми JDBC, використовуючи оператор try-with-resources, як показано в вище фрагменти.
Якщо ці пакети є транзакційними, тоді ви хочете вимкнути автозв'язок з'єднання і здійснити транзакцію лише тоді, коли всі пакети закінчені. Інакше це може призвести до брудної бази даних, коли перша група пакетів вдалася, а пізніше ні.
public void executeBatch(List<Entity> entities) throws SQLException {
try (Connection connection = dataSource.getConnection()) {
connection.setAutoCommit(false);
try (PreparedStatement statement = connection.prepareStatement(SQL)) {
// ...
try {
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
}
}
sql
не змінюється в циклі? якщо цей запит не змінюється для кожної ітерації циклу, то чому ви створюєте новийPreparedStatement
для кожної ітерації (у першому фрагменті коду)? Чи є для цього причина?