利用PreparedStatement对象进行批量操作(executeBatch),报内存溢出异常(OutOfMemoryError)

来源:百度知道 编辑:UC知道 时间:2024/05/21 10:45:31
rs 是一个结果集对象,由一个查询语句得出。记录数100000余。

........
String baseSql = "insert into tableA(ColA,ColB,ColC) values(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(baseSql);
int flag = 0;
while(rs.next()){
pstmt.setString(1,rs.get(1));
pstmt.setString(2,rs.get(2));
pstmt.setString(3,rs.get(3));
pstmt.addBatch();

flag++;
if(flag % 10000 == 0){
pstmt.executeBatch();
System.out.println("====" + flag);
}
}
pstmt.executeBatch();
conn.commit();
.....

程序运行结果显示,当执行第8个批次操作的时候报错,内容如下:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.Vector.ensureCapacityHelper(Vector.java:226)
at java.util.Vector.addElement(Vector.java:573)
at oracle.jdbc.driver.OracleResultSetC

解决办法:
1.加大内存,你一个内部循环搞定,产生了很多的句柄,堆栈内存放不下了
2.将一次操作封装到一个方法中,使用另一个方法来循环调用你封装的方法,自然就不会产生过多的无效句柄

我对这个问题也很感兴趣,能不能把完整的异常发给我,我试试能不能解决