簡體   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