6

澄清一下:我知道创建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 查询?

4

5 回答 5

8

1. If you are using the same PreparedStatement throughout the loop, then its better you keep the PreparedStatement outside the loop.

2. If you have sql statment which keeps changing inside the loop, then only its worth using it in the loop.

3. Moreover if its keep changing, then just use Statement instead of PreparedStatement, else the very purpose of PreparedStatement is lost as you keep changing it.

于 2012-08-15T14:58:30.193 回答
4

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

我不相信有什么要求对所有驱动程序都是如此,尽管它确实似乎是许多 JDBC 驱动程序的一个可能特性。听起来 MySQL 可能不会这样做: 如何使用 MySQL 准备好的语句缓存?

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

于 2012-08-15T15:00:52.750 回答
2

到目前为止我知道的两种方法。

第一种方式

它的插入记录一一

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();
于 2013-01-04T09:27:47.670 回答
1

每次都创建它是没有用的。请参阅链接http://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how-to-use-them-properly

于 2012-08-15T15:00:30.550 回答
1

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

于 2012-08-15T15:02:52.860 回答