【发布时间】:2016-01-04 08:10:13
【问题描述】:
我正在尝试使用批量插入从 csv 文件中读取数据并插入数据库。但它会引发多个异常。
java.sql.BatchUpdateException: A statement attempted to return a result set in executeBatch().<br>
SEVERE: Servlet.service() for servlet oms threw exception
java.lang.OutOfMemoryError: Java heap space ……. <br>
下面给出了插入代码:-
public long updateOpenOrdData(Connection conn, String[] paramStrObj)throws Exception {
long updatedRow = 0;
CallableStatement cstmt = null;
// System.out.println("StrAtt length :"+ strArr.length);
try{
for(int i=0; i<paramStrObj.length; i++){
int count =1;
int index = 0;
String[] dataArr = paramStrObj[i].split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
if(!dataArr[0].equals("SLC_Code_Desc") && dataArr.length >= 24 ){
cstmt = conn.prepareCall(PROC_INSERT_OPEN_ORD_TEMP);
System.out.print(dataArr[index]+", ");
cstmt.setString(count++, dataArr[index++]);
System.out.print(dataArr[index]+", ");
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index++]);
cstmt.setString(count++, dataArr[index]);
cstmt.setString(count++, null);
cstmt.setString(count++, null);
cstmt.setString(count++, null);
cstmt.addBatch();
//cstmt.executeUpdate();
}
}
int[] insertRow =cstmt.executeBatch();
System.out.println("Inserted row are :: "+insertRow);
}catch (Exception e) {
//System.out.println("Wrong data at line "+i+" and column "+ --index);
e.printStackTrace();
}finally{
new DBService().releaseResources(null, cstmt);
}
return updatedRow;
}
我需要插入最大 100 GB 的数据。 在这段代码中,每次插入一行。
【问题讨论】:
-
不久前我有一个very similar 问题。长话短说,我发现对文件执行一些预处理以确保它是有效的要容易得多。一旦我确认了这一点,我发现导入临时表要快得多。我的意思是我在不同的模式中为此明确目的创建的实际 SQL 表。我使用了 .NET 和 SqlBulkCopy,但您可以查看 BULK INSERT 或类似的东西。从内存中,有大量用于 Java 的 CSV 阅读器。
标签: java mysql jdbc prepared-statement