回复评论 |
以前同事曾经遇到这个毛病,一直以为是程序编写方面的问题。简单来说就是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类型来进行创建。 |
|||
最新评论
2 周 5 天 前
18 周 7 小时 前
19 周 23 小时 前
37 周 1 天 前
37 周 1 天 前
48 周 1 天 前
1 年 6 周 前
1 年 8 周 前
1 年 11 周 前
1 年 12 周 前