程序批量插入數據時報錯,將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都是單獨事務