[英]What is the difference between hibernate.jdbc.fetch_size and hibernate.jdbc.batch_size?
[英]What is the max JDBC batch size?
我有一個列表,該列表不斷增加。 我正在做依賴於列表大小的批量添加。 我忘了為指定大小的executeBatch設置限制。
計划工作了幾個小時。 我現在不想停下來,修理並重新開始。
我的問題是,決定添加批次的大小是什么? 批處理一次執行executeBatch()
的最大容量是多少? 多少次我可以使用addBatch
而不執行executeBatch()
?
PgJDBC對批次有一些限制:
所有請求值和所有結果必須在內存中累積。 這包括大blob / clob結果。 所以空閑內存是批量大小的主要限制因素。
直到PgJDBC 9.4(尚未發布) , 返回生成密鑰的批次總是為每個條目進行往返 ,因此它們並不比單個語句執行更好。
即使在9.4中,如果生成的值的大小受限,則返回生成的鍵的批次僅提供優勢。 請求結果中的單個text
, bytea
或無約束varchar
字段將強制驅動程序為每次執行執行往返 。
批量處理的好處是減少了網絡往返次數。 因此,如果您的數據庫是您的應用服務器的本地數據,則要少得多。 隨着批量大小的增加,回報逐漸減少,因為網絡等待所花費的總時間很快就會下降,所以通常不會強調嘗試盡可能大地批量生產。
如果您正在批量加載數據,請認真考慮使用COPY
API,通過PgJDBC的CopyManager
,通過PgConnection
接口獲取。 它允許您將類似CSV的數據流式傳輸到服務器,以便通過極少的客戶端/服務器往返快速批量加載。 不幸的是,它的記錄顯着不足 - 它根本沒有出現在主要的PgJDBC文檔中, 只出現在API文檔中 。
除了內存問題,AFAIK沒有限制。 關於你的問題:語句僅在執行批處理時發送到數據庫,因此在你執行批處理之前,內存將繼續增長,直到你得到JavaHeapSpace或批處理將被發送到數據庫。
根據JDBC實現,可能存在最大數量的參數標記。
例如,PostgreSQL驅動程序將參數數量表示為2字節整數 ,在Java中最多為32768。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.