java - Oracle下大交易如何处理?

标签 java spring oracle hibernate

我们的应用程序基于 Hibernate 3.5、Spring 3.1 和 Oracle 我一直遇到 Max Cursors Exceeded 问题,主要是在处理大事务时(涉及的实体数量大,执行的查询数量大)。在 H2、MS SQL Server 或 MySQL 上运行应用程序时不会出现此类问题。

如果我正确理解了我的调查结果,Oracle 会为事务期间构建的每个 ResultSet 创建一个游标,并且这些游标仅在调用 Connection< 上的 close 时释放(即 Hibernate session )。

我的问题(目前):

  1. 有没有办法让 Oracle 在运行时清理游标? 交易正在进行中?有很多查询结果 在交易的特定点之后不需要,但是 Oracle 似乎使游标保持打开状态。
  2. 是否有“正常”的最大光标设置?默认为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/

相关文章:

java - 如何将 map 存储在Spring项目使用的.properties文件中?

Java JMenu CTRL+C 快捷键不起作用

java - 提交 Spring 表单时执行 Javascript 函数

javascript - Spring MVC JavaScript

Oracle DBMS_SCHEDULER 用例一次运行 1 个作业,但将后续作业排队以运行 FIFO

oracle - 我可以对交互式网格行删除进行验证吗?

java - 多人网络仅适用于专用网络

run 方法中的 java.io.OptionalDataException?

database - Spring Framework 中的默认隔离级别

sql - Oracle 游标表达式与标准连接