hibernate3.2在容器数据源下的游标过多?

系统采用hibernate 3.2.0运行在websphere app server 6.0.2下,使用was提供的数据源连接oracle 10g。

dao类中获取hibernate session的方式,都是通过ThreadLocal来的,并且确认会在数据库操作完成之后,在finally中执行Session.close()。 但是运行时间长了以后,出现ORA-01000: maximum open cursors exceeded

我详细翻看了robbin对这个问题的论述,基本得出结论:jdbc规范中要求connection在close的时候自动close它所产生的 statement和result set,但是容器的数据源中的connection,因为倍容器托管了,所以在close的时候,并不会按照jdbc的规范去做,它只是回到连接池,而不 是真正关闭。所以执行Session.close后,但是Statement没有被同时关闭,而且因为仍然被应用也不会被gc,长时间运行就会造成游标过 大。

知道了原因,但是目前没找到解决办法,Session对象似乎没有提供api让我去管理它所创建的Statement。请问大家是如何考虑以及解决这个问题的?有没有相关的文档或者建议?

回复:

我在was数据源属性里面设置了销毁时间,数据库连接隔一段时间就销毁一次重新生成,根据jdbc规范,应该能够清理掉遗留的statement和result set。等几天才能看到效果。

hibernate自己用的statement和resultset它自己会关闭吧,是不是你直接使用了connection而没有关闭statement和resultset呢,没听说过要人工帮hibernate去关闭的。

Hibenate will close its own statements and resultsets, the resson for 'too many cursors' should be in your own code which doesn’t close the statement and result after you finsish your own operation.

在hibernate.org的一个faq上看到了这一条:

Q:After a while, Oracle throws this exception: too many open cursors

A:The Oracle JDBC driver doesn't much like to have its prepared statements cached. Disable PreparedStatement caching for the connection pool.

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值