Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Oracle下处理大型事务?_Java_Spring_Oracle_Hibernate - Fatal编程技术网

Java 如何在Oracle下处理大型事务?

Java 如何在Oracle下处理大型事务?,java,spring,oracle,hibernate,Java,Spring,Oracle,Hibernate,我们的应用程序基于Hibernate 3.5、Spring 3.1和Oracle,我经常遇到Max Cursors Oversed问题,主要是在处理大型事务时(涉及的实体数量和执行的查询数量都很大)。在H2、MS SQL Server或MySQL上运行应用程序时,不会出现此类问题 如果我正确理解了调查结果,Oracle会为事务期间生成的每个ResultSet创建一个游标,只有在调用连接上的close(即Hibernate会话)时才会释放这些游标 我的问题(目前): 有没有办法让Oracle在 交

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

如果我正确理解了调查结果,Oracle会为事务期间生成的每个ResultSet创建一个游标,只有在调用
连接上的
close
(即Hibernate会话)时才会释放这些游标

我的问题(目前):

  • 有没有办法让Oracle在 交易正在进行?有很多查询结果 在事务中的特定点之后不需要,但是 甲骨文似乎保持游标打开
  • 是否有“正常”最大光标设置?默认值为50,大多数情况下 我们的客户设置了大约400-600个游标,但有些 我看到的论坛帖子似乎表明有几千条是 更常见。我们似乎也从我们的团队中得到了很多回击 当我们建议将最大游标计数增加到 (说)5000。这真的有什么大不了的吗
  • 坦白地说,我读过的大多数论坛帖子都与ResultSet/Statement/connectionleaks有关,但从我们的分析来看,我们没有这些帖子;在我们关闭连接的那一刻,当前光标计数将恢复正常。我们似乎是唯一在试图在一个事务中执行几百个操作时遇到问题的人。真的是这样不正常吗


    谢谢你的建议;这些东西甚至会让我的白发脱落

    Oracle为每个结果集创建光标,并在关闭结果集时释放光标(jdbc resultset.close()或类似)。对于任何设计良好的应用程序来说,每个会话默认打开50个游标就足够了(一旦我对它进行了测量,在生产模式下,它从未超过20个)

    您应该检查如何使Hibernate在获取后关闭结果集。一般来说,如果会话真的需要1000个打开的游标,我无法想象它应该做什么。我从来没有见过max_open_游标超过1000组,所以,我想,对于设计糟糕的应用程序来说,这也足够了(但是……清醒地说,完美是没有限制的,我从来没有使用Hibernate)


    每个游标都意味着一些内存,因此增加max\u open\u游标并不是零价格的解决办法。

    您可能会说您存在某种资源泄漏。这种问题在99.99%的情况下是由应用程序中的错误引起的。在可能的情况下,您应该使用java7构造并尝试使用资源。调查这些问题的通常方法是:

    • 从DBA请求选择目录角色(这将使您能够访问
      v$
      Oracle视图)
    • 让应用程序在浪费资源的同时运行
    • 通过
      select*from v$open\u cursor查看我们打开的游标。如果幸运的话,您将获得每个泄漏游标的Sql查询
    • 如果您没有使用hibernate,sql文本将直接指向源代码中的要点。但既然你使用了hibernate,你就可以猜了。实体管理器有时非常不可预测

    PS:游标类似于JVM中的线程。它是在“某个”虚拟机中执行某些代码的地方。一个连接上可以有多个游标。关闭结果集时,光标处于关闭状态。通过这样做,您可以告诉Oracle您不再关心来自SQL查询的任何其他行。当然,当您关闭连接时,它的所有游标也将关闭。但当您只需要关闭结果集时,请不要关闭连接。打开新连接是一项非常详尽的任务。

    我们通常需要多达8000个连接。这不是一个巨大的资源消耗。如果设置一个大的值有帮助,那就去做吧。只需确保没有泄漏(正如您已经在做的那样)。您是否使用较新版本的Hibernate进行了实验?3.5真的很老了。你可能会发现一个很老的bug/设计缺陷,这个缺陷早就被修复了。我通过Hibernate 3.6对Oracle做了一些非常棘手的事情,但从未遇到过这个问题。我们在下一个小版本的待办事项列表中升级到Hibernate 4,到目前为止还没有考虑升级到3.6。。。但我现在要试一下。感谢在几乎所有遇到“超过最大游标数”问题的情况下,都表明代码中存在错误:您没有正确关闭结果集和语句。我在某个地方读过(不要问我在哪里,我希望我记得,但我觉得我在网上读到了每一个包含Oracle一词的文档)Oracle仅在调用Connection.close时删除游标。因此,我再次检查了代码,发现了一到两个可能的漏洞,我们现在正在重新测试。谢谢,现在就这么做(另请参阅我对软件商Sanders的帖子的评论)