繁体   English   中英

在循环内创建预准备语句

[英]Creation of a prepared statement inside a loop

澄清一下我知道在循环外创建PreparedStatement是正确的。 出于好奇,我问过这个问题。


让我们假设我在一个循环中创建一个PreparedStatement并且始终使用相同的SQL查询。

final String sql = "INSERT INTO ...";
while (condition) {
   ...
   PreparedStatement statement = connection.prepareStatement(sql);
   // Fill values of the prepared statement
   // Execute statement
   ...
}

这是无用的,因为PreparedStatement对象总是重新创建? 或者底层数据库是否认识到它始终与创建PreparedStatement SQL查询相同并重用它?

1.如果您在整个循环中使用相同的 PreparedStatement ,那么最好将 PreparedStatement 保持 在循环之外

2.如果你的sql语句在循环中不断变化 ,那么只有它在循环中使用它的价值。

3.此外,如果它不断变化,那么只需使用Statement 而不是 PreparedStatement ,否则PreparedStatement的目的就会丢失,因为你不断改变它。

有些驱动程序会缓存预准备语句,是的。 例如,浏览此Oracle文档: http//docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

我不相信有任何事情要求所有驱动程序都是如此,尽管它似乎是许多JDBC驱动程序的一个可能特征。 听起来MySQL可能不会这样做: 如何使用MySQL预处理语句缓存?

也就是说,如果你真的想要有效地使用预处理语句,那么在每个循环迭代中使用的预处理语句的实例似乎更加有意义。

到目前为止,我知道两种方式。

第一道路

它的插入记录一个接一个

final String sql = "INSERT INTO tablename(columnname) Values(?)";

PreparedStatement statement = connection.prepareStatement(sql);

while (condition) {
statement.setString(1,value);
statement.executeUpdate();
}

(要么)

第二种方式

它将所有记录作为批量插入插入

final String sql = "INSERT INTO tablename(columnname) Values(?)";

PreparedStatement statement = connection.prepareStatement(sql);

while (condition) {
statement.setString(1,value);
statement.addBatch();
}

statement.executeBatch();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM