透過多次迭代重複使用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中文網其他相關文章!