簡體   English   中英

可以添加到PreparedStatement批更新中的參數集的最大數量是多少?

[英]What is maximum number of parameter sets that can added to a PreparedStatement Batch Update?

我需要執行超過100000條插入語句,例如通過jdbc執行以下操作:

Connection connection = datasource.getConnection();
String sql = "Insert Into Table (ColA, ColB) Values(?, ?)";  
String[][] params = /*some array*/

PreparedStatement statement = connection.prepareStatement(sql);  
for(String[] var : params)  
{  
    statement.setString(1, var[0]);  
    statement.setString(2, var[1]);  
    statement.addBatch();  
}    

statement.executeBatch();  

我以為這將是一個常見的問題,但我似乎找不到任何明確的答案。 它是一個跨數據庫項目。

這將取決於您在MySQL中的MAX_ALLOWED_PACKET設置(如果您使用的是該設置)。

在客戶端上,MySQL的默認最大數據包大小為16 MB。

您可以通過以下任一方式更新值:

[mysqld]
max_allowed_packet=64M

要么

mysql --max_allowed_packet=64M

http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

當然,這是假設您正在使用MySQL。 其他數據庫可能具有不同的設置。

我認為唯一的限制是磁盤工作空間和內存。 請參閱以下討論: http : //social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/d16af627-d374-4ac2-ba6d-017729fe3206

您應該能夠使用單元測試(JUnit)對此進行仿真。 如果交易中途終止,通過交易進行管理還可以為您省去很多麻煩。

這可能不是一個常見的問題,因為還有其他方法可以做到這一點。 我個人的建議是創建一個存儲過程,以接收准備好的數據(例如XML文檔)並以真正的批處理格式進行處理。

它實際上取決於應用程序運行的幾個因素。 因為您主要處理String,所以應該能夠得到長度為Integer.MAX_VALUE [總是2147483647(2 ^ 31-1])的String,這是Java規范的值,它是String類用於內部數組的最大大小。存儲空間]或最大堆大小的一半(因為每個字符為兩個字節)(以較小者為准)。請確保在您的應用程序設計中,堆上的jvm使用率不超過分配的數量,否則您將得到內存不足錯誤。

暫無
暫無

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

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