以前同事曾经遇到这个毛病,一直以为是程序编写方面的问题。简单来说就是rs.next()到一定的数目,程序退出。自己重新写时候,参照oracle的优化规则,对程序进行了手工提交,批量更新等优化措施。但是执行到一定时候还是这样,不过我接到了异常是OutOfMemoryError。 于是我去掉了rs.last()这一句,程序得以执行,但也在8万条记录后退出,报相同异常,看起来似乎是油标把记录都读到内存引起的。但程序结构应该没什么大的问题。于是上网查了一下,发现也有人有相同的问题,有人也指出毛病,但没有明确的解决办法。还有人说分开几个记录集来处理... 找来找去,终于发现,是Orace的jdbc程序的特性,有人在相同100万记录的规模里,在db2里不会出错,而在Oracle里会出错。原来当用Oracle的statement时,如果创建的时候使用ResultSet.TYPE_SCROLL_INSENSITIVE参数指定,虽然可以在油标里自由滚动,但因为不可见别人的更新,势必cache已得到的ResultSet,那么当记录数很多时,就会造成内存溢出(经过测试或ResultSet.TYPE_SCROLL_SENSITIVE参数也无法在大数据集中使用)。所以在操作超大ResultSet(这里特指Oracle JDBC,可能其它JDBC实现有所不同,这里所用的Oracle JDBC版本为10.2.0.3.0),应该使用ResultSet.TYPE_FORWARD_ONLY类型来进行创建。 |
|||
简单明了,也说出了 提交者: 游客 (未验证)
最新评论
13 周 3 天 前
14 周 3 天 前
32 周 4 天 前
32 周 4 天 前
43 周 4 天 前
1 年 2 周 前
1 年 3 周 前
1 年 7 周 前
1 年 8 周 前
1 年 8 周 前