我们的应用程序基于Hibernate 3.5、Spring 3.1,并在Oracle下运行时遇到了“Max Cursors Exceeded”问题,主要发生在处理大事务(实体数量大,执行的查询数量多)时。但在H2、MS SQL Server或MySQL上运行应用程序时不会出现此类问题。
如果我的调查结果正确,Oracle为事务期间建立的每个ResultSet创建一个游标,这些游标只有在调用Connection(即Hibernate Session)的close方法时才会释放。
我的问题(目前为止):
1. 是否有办法使Oracle在事务进行中清理游标?在特定时间点之后不需要许多查询结果,但是Oracle似乎仍然保持着游标。
2. 是否有“正常”的最大游标设置?默认值为50,我们的大多数客户设置为400-600个游标,但我看过的一些论坛帖子似乎表明几千个更常见。当我们建议增加最大游标计数到5000时,我们的客户DBA似乎都反对。那真的很重要吗?
坦白地说,我读过的大多数论坛帖子都与ResultSet/Statement/Connection泄漏有关,但根据我们的分析,我们并没有这些问题;一旦我们关闭连接,当前游标计数就会恢复正常。我们似乎是唯一一个在单个事务中执行几百个操作时遇到问题的人。这真的很不正常吗?
谢谢任何建议;这让我的头发都掉了。
如果我的调查结果正确,Oracle为事务期间建立的每个ResultSet创建一个游标,这些游标只有在调用Connection(即Hibernate Session)的close方法时才会释放。
我的问题(目前为止):
1. 是否有办法使Oracle在事务进行中清理游标?在特定时间点之后不需要许多查询结果,但是Oracle似乎仍然保持着游标。
2. 是否有“正常”的最大游标设置?默认值为50,我们的大多数客户设置为400-600个游标,但我看过的一些论坛帖子似乎表明几千个更常见。当我们建议增加最大游标计数到5000时,我们的客户DBA似乎都反对。那真的很重要吗?
坦白地说,我读过的大多数论坛帖子都与ResultSet/Statement/Connection泄漏有关,但根据我们的分析,我们并没有这些问题;一旦我们关闭连接,当前游标计数就会恢复正常。我们似乎是唯一一个在单个事务中执行几百个操作时遇到问题的人。这真的很不正常吗?
谢谢任何建议;这让我的头发都掉了。