[英]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.