İkinci yol biraz daha etkilidir, ancak çok daha iyi bir yol onları gruplar halinde yürütmektir:
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();
}
}
Bununla birlikte, aynı anda kaç grup yürütebileceğiniz JDBC sürücü uygulamasına bağımlısınız. Örneğin bunları her 1000 partide bir yürütmek isteyebilirsiniz:
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();
}
}
}
}
Çok iş parçacıklı ortamlarla ilgili olarak, bağlantı ve ifadeyi mümkün olan en kısa kapsamda aynı yöntem bloğu içinde, try-with-resources deyimini kullanarak normal JDBC deyimine göre alır ve kapatırsanız, bu konuda endişelenmenize gerek yoktur . parçacıkların üstünde.
Bu gruplar işlemsel ise, bağlantının otomatik taahhüdünü kapatmak ve işlemi yalnızca tüm gruplar bittiğinde uygulamak istersiniz. Aksi takdirde, ilk grup başarılı olduğunda ve daha sonra başarısız olduğunda kirli bir veritabanına neden olabilir.
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
döngüde değişmiyor mu? bu sorgu döngünün her yinelemesi için değişmiyorsa, o zaman nedenPreparedStatement
her yineleme için yeni bir tane oluşturuyorsunuz (ilk kod parçacığında)? Bunu yapmak için herhangi bir sebep var mı?