日期:2014-05-16  浏览次数:20454 次

[原] Oracel JDBC 内存 问题

Oracle JDBC 驱动, 会使用大量的内存, 如果控制不好很容易导致Java出现Out of memory错误.

耗内存有多方面的原因: 主要包括四个方面: (下面的讨论全部基于我自己的环境: ojdbc6.jar, version是11.1.0.7.0-Production?, Oracle 10G, Java6(JDBC4) )

?

详见我自己的blog文章:

[原] Oracel JDBC 内存 问题

?

1 楼 freish 2011-06-24  
目前还没碰到因为oracle jdbc驱动问题导致OutOfMemory的
2 楼 smithfox 2011-06-24  
freish 写道
目前还没碰到因为oracle jdbc驱动问题导致OutOfMemory的

常见的 business web application应该不会有OOM问题, 因为所查询的数据量本身就比较小, 这种appliaction更多的是强调 table relationship, 业务 rule, and filter之类的.

但还有一部分程序是做后台的大数据的分析或是同步, 尤其是在分布式环境的维护.
3 楼 grave 2011-06-25  
smithfox 写道
freish 写道
目前还没碰到因为oracle jdbc驱动问题导致OutOfMemory的

常见的 business web application应该不会有OOM问题, 因为所查询的数据量本身就比较小, 这种appliaction更多的是强调 table relationship, 业务 rule, and filter之类的.

但还有一部分程序是做后台的大数据的分析或是同步, 尤其是在分布式环境的维护.

直接写stored procedure了吧..难道你还全取出来用完再塞回去么?而且你觉得换个数据库和jdbc驱动就不会出现这个问题么.
4 楼 smithfox 2011-06-25  
grave 写道
smithfox 写道
freish 写道
目前还没碰到因为oracle jdbc驱动问题导致OutOfMemory的

常见的 business web application应该不会有OOM问题, 因为所查询的数据量本身就比较小, 这种appliaction更多的是强调 table relationship, 业务 rule, and filter之类的.

但还有一部分程序是做后台的大数据的分析或是同步, 尤其是在分布式环境的维护.

直接写stored procedure了吧..难道你还全取出来用完再塞回去么?而且你觉得换个数据库和jdbc驱动就不会出现这个问题么.

用stored procedure解决业务计算? 每个人所处的Application和Business都不一样.
如果你没有遇到过 scale out 问题, 没有Global Level Database问题.
你就不会理解这些问题:
for example:
user信息是存在不同城市的 物理 Database Instance的, 你根本就无法在DataBase level处理一个新的用户是否已经在系统了.

这些都是 sale out的基本问题!

扯远了! 只想说: 如果你没遇到这个问题, 表示你所处Application和Business和我的不一样.或是你的解决方案不用 Oracle Database and Java
5 楼 joachimz 2011-06-27  
印象与ResultSet的类型相关,如果是scrollable的,Oracle会把所有结果集都放在内存到OOM,否则应该没有OOM问题。
6 楼 smithfox 2011-06-27  
joachimz 写道
印象与ResultSet的类型相关,如果是scrollable的,Oracle会把所有结果集都放在内存到OOM,否则应该没有OOM问题。

恩, 谢谢提醒, 这个也是一个很重要的一个方面:

可以通过:

stmt1 = this._conn.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt1.setFetchDirection(ResultSet.FETCH_FORWARD);

应该这种方式来做到你说的这一点!