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

rs是一个结果集对象,由一个查询语句得出。记录数100000余。........StringbaseSql="insertintotableA(ColA,ColB,Col... 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.OracleResultSetCacheImpl.put(OracleResultSetCacheImpl.java:67)
at oracle.jdbc.driver.ScrollableResultSet.putCachedValueAt(ScrollableResultSet.java:1951)
at oracle.jdbc.driver.ScrollableResultSet.cacheRowAt(ScrollableResultSet.java:1595)
at oracle.jdbc.driver.ScrollableResultSet.isValidRow(ScrollableResultSet.java:1571)
at oracle.jdbc.driver.ScrollableResultSet.next(ScrollableResultSet.java:301)

我想知道问题到底出在了哪里!!!明明是分批操作,而且前几批是成功了的啊!如果哪个对象惹得祸,它又是如何导致异常发生的?
展开
 我来答
飞蛋蛋
2009-07-01 · TA获得超过973个赞
知道小有建树答主
回答量:816
采纳率:0%
帮助的人:652万
展开全部
解决办法:
1.加大内存,你一个内部循环搞定,产生了很多的句柄,堆栈内存放不下了
2.将一次操作封装到一个方法中,使用另一个方法来循环调用你封装的方法,自然就不会产生过多的无效句柄
百度网友babecbb56
2009-07-01 · TA获得超过439个赞
知道答主
回答量:54
采纳率:0%
帮助的人:0
展开全部
我对这个问题也很感兴趣,能不能把完整的异常发给我,我试试能不能解决

参考资料: 有问题,可以hi我

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式