首頁 > Java > java教程 > 主體

如何最佳化多次迭代的PreparedStatement重複使用?

DDD
發布: 2024-10-27 16:33:29
原創
611 人瀏覽過

 How to Optimize PreparedStatement Reusage for Multiple Iterations?

透過多次迭代重複使用PreparedStatement

如果在沒有連接池的情況下使用單一公共連接,您可能會遇到以下問題為每個DML 或SQL 操作建立一個新的PreparedStatement實例是否更有效,同時保留準備好的語句的優點。

而不是:

<code class="java">for (int i=0; i<1000; i++) {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
    preparedStatement.close();
}
登入後複製

您可以考慮:

<code class="java">PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
    preparedStatement.clearParameters();
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
}
preparedStatement.close();
登入後複製

雖然第二種方法提供了輕微的效率提升,但更好的解決方案在於批次執行:

<code class="java">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();
    }
}</code>
登入後複製

這種方法利用了JDBC 驅動程式提供的批次功能,減少了往返資料庫並提高效率。您可以透過定義批次大小限制來進一步最佳化,例如每1000 條執行:

<code class="java">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.
            }
        }
    }
}</code>
登入後複製

對於多執行緒環境,您可以透過在最短的時間內取得並關閉連線和語句來確保執行緒安全使用try-with-resources 語句的可能範圍,如上面的程式碼片段所示。對於事務批次,停用自動提交並僅在所有批次完成後提交事務。

以上是如何最佳化多次迭代的PreparedStatement重複使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!