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

  • We've moved!

    We've moved!

    7 Ocak 2008
  • humanHardDrive

    humanHardDri

    16 Mart 2011
  • sk8ingis4me

    sk8ingis4me

    16 Mart 2006