重用一个PreparedStatement进行多个操作
在没有连接池的情况下使用单个连接的情况下,有一个关于如何处理的问题创建和使用PreparedStatements。一种选择是为每个 SQL/DML 操作创建一个新的PreparedStatement实例:
<code class="java">for (int i=0; i<1000; i++) { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); preparedStatement.close(); }
或者,可以通过清除其参数并重新设置值来重用同一个PreparedStatement实例:
<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();
建议和多线程注意事项
为了获得最佳效率,请考虑批量执行PreparedStatement操作:
<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 习惯用法,使用 try-with-resources 确保资源管理得到适当处理。
对于事务批处理,请在连接上禁用自动提交,并仅在所有批处理成功完成后才提交,以避免潜在的数据库不一致。
以上是我应该为每个 SQL 操作创建新的PreparedStatements 还是重复使用相同的语句?的详细内容。更多信息请关注PHP中文网其他相关文章!