一、出現的問題
近期公司有個老專案(資料庫使用的 postgresql )需要維護需改,其中需要使用excel **匯入大批量的資料,因為excel匯入資料存在太多不確定性,大量的資料校驗和資料的關聯查詢是避免不了的,這就會導致響應時間太久,這裡為了優化採取了資料庫的批量插入,在小資料量時,批量插入還算正常,當資料量過大時就出現了以下的報錯;
報錯資訊:caused by: j**a.io.ioexception: tried to send an out-of-range integer as a 2-byte value: 120237
caused by: j**a.io.ioexception: tried to send an out-of-range integer as a 2-byte value: 120237at org.postgresql.core.pgstream.sendinteger2(pgstream.j**a:211) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]at org.postgresql.core.v3.queryexecutorimpl.sendparse(queryexecutorimpl.j**a:1409) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.core.v3.queryexecutorimpl.sendonequery(queryexecutorimpl.j**a:1729) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.core.v3.queryexecutorimpl.sendquery(queryexecutorimpl.j**a:1294) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.core.v3.queryexecutorimpl.execute(queryexecutorimpl.j**a:280) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.pgstatement.executeinternal(pgstatement.j**a:430) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.pgstatement.execute(pgstatement.j**a:356) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.pgpreparedstatement.executewithflags(pgpreparedstatement.j**a:168) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.pgpreparedstatement.execute(pgpreparedstatement.j**a:157) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
問題出現原因:查了查 這是因為postgresql資料庫jdbc driver對prepared statement的引數 set的時候, client端的乙個傳送大小限制在2-byte。
二、解決方法(分批插入)
1、首先想到的是,用乙個count值標識,記錄一下當list集合的size達到一定量進行批量插入一次,然後再把集合清空(使用list.clear())最後在迴圈外進行最後一次插入;這樣雖然可以解決但是**冗餘太大而且不容易維護;
2、提取了乙個公用類:
package com.**.**.framework.utils;import
org.apache.commons.collections.collectionutils;
import
j**a.util.list;
/***
@author
d-l * @classname batchhandlerutil
* @version 1.0
* @description 分批處理list集合工具類
* @date 2020/7/30 */
public
class batchhandlerutil
list
items =list.sublist(i, end);
resolve.resolve(items);}}
}
函式式介面:j**a8新特性(@functionalinte***ce),提供乙個處理業務邏輯的函式:
package com.**.**.framework.utils;import
j**a.util.list;
/***
@author
d-l * @classname commonresolve
* @version 1.0
* @description 分批處理list集合 (因為資料庫批量插入有一定的限制)
* @date 2020/7/30 */
@functionalinte***ce
public
inte***ce
commonresolve
使用方法:
if(datasourcelist.size() > 0));}
批量插入oracle資料庫
odp技術,引數可以為陣列 注意事項 1 時間處理 防止資料庫中有date型別的資料,不設定格式則會出現無效月份的情況,如 new oracledate 2011 08 26 17 18 19 oracleglobalization og oracleglobalization.getclienti...
DataTable批量插入資料庫
最近在將excel中的檔案匯入到資料庫中,用程式進行編寫,由於資料量較大所以速度很慢,後來採用了sqlbulkcopy類,解決了速度的問題,我就insert語句,sqldataadapter.update dataset,tablename sqlbulkcopy.writetoserver dat...
DataTable批量插入資料庫
最近在將excel中的檔案匯入到資料庫中,用程式進行編寫,由於資料量較大所以速度很慢,後來採用了sqlbulkcopy類,解決了速度的問題,我就insert語句,sqldataadapter.update dataset,tablename sqlbulkcopy.writetoserver dat...