資料庫批量插入上限問題

2022-09-15 11:12:09 字數 2936 閱讀 8860

一、出現的問題

近期公司有個老專案(資料庫使用的  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...