簡體   English   中英

批量更新與IN(x,x,x)

[英]Batch update versus IN (x,x,x)

我需要創建一個字段更新到ID列表。 此列表的大小可變。

我想知道的是,接下來的兩個可能的選擇中哪個更好?

選項1:批量更新:

PreparedStatement update = connection.prepareStatement(" UPDATE table set field = value where id = ?");
for (id : ids){
    update.setInt(id);
    update.addBatch();
}
update.executeBatch();

選項2:IN(x,x,x)

PreparedStatement list_update = connection.prepareStatement( "UPDATE table set field = value where id in ( " + comma_separated_ids(ids) + ")" );

private String comma_separated_ids(int[] ids){
     // receives [1,2,3] and returns "1,2,3"
}

我更傾向於第二個,但由於可能的SQL注入,我不喜歡where id in ( " + comma_separated_ids(ids) + ")" );where id in ( " + comma_separated_ids(ids) + ")" );

那么,哪種選擇更好呢? 1號或2號。如果是2號,如何避免SQL注入?

選項1相當優雅,但是使用選項2時,您將具有更好的性能(如果參數數量在某個時候變大,則性能會更高)。 只需添加多少? 由於需要IN參數...然后再次循環並進行設置。 不要在IN子句中按原樣設置值,請使用參數化方式 (帶有?的東西)。

甚至有兩個循環比對數據庫執行相同數量的查詢要快得多。 而且,盡管確實如此,但是如果您正在使用PreparedStatement,則將一次執行批處理中的所有查詢,但是數據庫服務器將執行與您構建的批處理語句數量一樣多的UPDATE查詢。 另一個要點是交易 ,由您決定是全部還是不決定,但這總會增加一些時間。 您始終可以衡量兩個解決方案。

注意:我在StackOverflow中看到了很多答案,其中指出了幾個? 不能用作IN子句上的參數...至少在以下情況下是不正確的:使用JDBC 4.0的DB2,Oracle和MySQL。 它確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM