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