我们的应用程序基于 Hibernate 3.5、Spring 3.1 和 Oracle 我一直遇到 Max Cursors Exceeded 问题,主要是在处理大事务时(涉及的实体数量大,执行的查询数量大)。在 H2、MS SQL Server 或 MySQL 上运行应用程序时不会出现此类问题。
如果我正确理解了我的调查结果,Oracle 会为事务期间构建的每个 ResultSet 创建一个游标,并且这些游标仅在调用 Connection< 上的
(即 Hibernate session )。 close
时释放
我的问题(目前):
- 有没有办法让 Oracle 在运行时清理游标? 交易正在进行中?有很多查询结果 在交易的特定点之后不需要,但是 Oracle 似乎使游标保持打开状态。
- 是否有“正常”的最大光标设置?默认为50,大部分 我们的客户设置了大约 400-600 个光标,但其中一些 我看到的论坛帖子似乎暗示几千是 比较普遍;普遍上。我们似乎也受到了很多来 self 们的反对 当我们建议将最大游标数增加到 (比如)5000。这真的有什么大不了的吗?
坦率地说,我读过的大多数论坛帖子都与 ResultSet/Statement/Connection 泄漏有关,但根据我们的分析,我们没有这些;在我们关闭连接的那一刻,当前游标计数恢复正常。我们似乎是唯一在尝试在单个事务中执行几百个操作时遇到问题的人。真的有这么不正常吗?
感谢您的建议;这东西连我的白发都掉了
最佳答案
Oracle 为每个结果集创建游标并在关闭结果集时释放它(jdbc ResultSet.close() 或类似的)。每个 session 默认 50 个打开的游标对于任何设计良好的应用程序来说都足够了(我对其进行了测量,在生产模式下它从未超过 20 个)。
您应该检查如何让 Hibernate 在获取后关闭结果集。一般来说,我无法想象如果真的需要 1000 个打开的游标, session 应该做什么。我从未见过 max_open_cursors 设置超过 1000,所以,我想,这对于设计糟糕的应用程序来说也足够了(但是......清醒的事实没有完美的限制,而且我从不使用 Hibernate)。
每个游标都意味着一些内存,因此增加 max_open_cursors 不是零价格解决方法。
关于java - Oracle下大交易如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508713/