在循环内创建预准备语句

时间:2012-08-15 14:52:43

标签: java sql jdbc prepared-statement

澄清:我知道在循环外创建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查询相同并重用它?

5 个答案:

答案 0 :(得分:7)

1。如果您在整个循环中使用相同 PreparedStatement,那么会更好地保留 {{1在循环之外

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

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

答案 1 :(得分:3)

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

我不相信有任何事情要求所有驱动程序都是如此,尽管它似乎是许多JDBC驱动程序的一个可能功能。听起来MySQL可能不会这样做: How to use MySQL prepared statement caching?

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

答案 2 :(得分:1)

另请尝试使用Connection.setAutoCommit(false)禁用自动提交,并使用PreparedStatement.executeBatch()

答案 3 :(得分:1)

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

第一种方式

它的插入记录一个接一个

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();

答案 4 :(得分:0)