SORU
18 Mart 2010, PERŞEMBE


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
18 Mart 2010, PERŞEMBE


İ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;
            }
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • wolfys you tube

    wolfys you t

    22 Kasım 2006