Bir PreparedStatement yeniden birden çok kez
herhangi bir havuz olmadan tek bir ortak bağlantı ile PreparedStatement kullanılması durumunda, her vid/sql operasyon hazırlanan tabloların güç mantaining için bir örnek yeniden kurabilir miyim?
Yani:
for (int i=0; i<1000; i ) {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
preparedStatement.close();
}
yerine:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i ) {
preparedStatement.clearParameters();
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
}
preparedStatement.close();
benim sorum birden çok iş parçacığı bir ortamda içine bu kodu koymak istiyorum gerçeği ile ortaya çıkıyor, bana biraz tavsiye verebilir misiniz? teşekkürler
CEVAP
İkinci yol biraz daha etkilidir, ama çok daha iyi bir şekilde toplu olarak yürütülecek
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();
}
}
Kaç kişi aynı anda yürütebilir OLANLARI sürücüsü uygulama ancak bağımlı oluyorsun. Örneğin her 1000 toplu idam etmek 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(); // Execute every 1000 items.
}
}
}
}
Çok iş parçacıklı ortamlarda ve Bağlantı elde kapatın ve mümkün olan en kısa kapsamda deyimi eğer bu konuda endişelenmenize gerek yokiçinde aynı yöntem bloknormal OLANLARI göre yukarıda parçacıkları gösterildiği gibi try-with-resources deyimini kullanarak deyim.
Eğer bu toplu işlem, bağlantı otomatik yürütme kapatın ve sadece tüm toplu bittiğinde hareketi tamamlamak istiyorum. Aksi takdirde partiler ilk grup başarılı olunca kirli bir veritabanı neden ve daha sonra değil.
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;
}
}
}
}
Yeniden adlandırma birden fazla Unıx d...
&Lt giriş birden fazla satır;ınput typ...
Java sorgu.sql.PreparedStatement...
AngularJS, HTML5 modu sayfa yanlış ver...
Koşu git deposu başlatmak veya varolan...