postgres批量插入報錯排查


程序批量插入數據時報錯,將sql在navicat執行又不報錯。報錯信息:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800

查詢資料參考資料發現postgreSQL JDBC驅動限定,client端的一個發送大小限制為2byte。
也就是批量插入的時候values里面的參數個數(行數*列數)不能超過32767。建議批量插入的時候設置為1000行左右提交一次。

引用:
這里舉兩個代表性栗子:
sql渣:

for i in (1-1000):
start transaction;
insert into table values (1);
commit;
end for

sql贊:

start transaction;
for i in (1-1000):
insert into table values (1);
end for
commit;

sql贊爆:

insert into table values (1)()...........()(1000);

首先,sql語法是我臨時自創的,這個不是關鍵,關鍵在sql渣先生是1000個事務插1000行,日志flush1000次。sql贊先生是一個事務插1000行,事務日志flush1次。sql贊爆最nice。
這個例子我想表達的意思是如果你要用sql做一件事,那就要盡量讓這件事占用的事務總時間最少。

第二個例子
sql渣:

update table where id > 0 and id < 1000000;

sql贊:

update table where id > 0 and id < 1000;
update table where id >= 1000 and id < 2000;
update table where id >= 2000 and id < 3000;

....
....
這個例子我想表達的意思是如果你要用sql做一件很大的事,那就盡量讓大事化成很多小事。
兩個例子好好體會下,一點不矛盾哦。補充一下,這里每個update都是單獨事務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM