连接池行为ODP.NET



我正在尝试用ODP.NET计算连接池的行为。我了解了基本知识,但不了解发生了什么。我有一个应用程序,它每X秒启动一次线程,该线程连接并对数据库执行多次搜索,然后断开连接,所有内容都被处理并断开连接。由于连接字符串中的默认值和X设置为一个高数字,以确保在下一次搜索之前完成搜索,我得到了一个异常,而不是像我预期的那样在连接上,而是在OracleDataAdapter.Fill((上。我得到了以下异常:

'ORA-00604: error occurred at recursive SQL level 1 ORA-01000: maximum open cursors exceeded'

第9次连接后。每次。然后,应用程序将无限期运行,不会出现其他错误。这肯定与连接池有关。如果我关闭池,它可以正常工作。如果我将"最小池大小"(Min Pool Size(调大,则会花更长的时间出现错误,但最终会发生这种情况。

我对连接池的期望是等待连接以获得新连接的调用,而不是在已经连接的适配器上填充失败(尽管我知道连接对象正在使用池,所以可能不是这样(。不管怎样,这是一种奇怪的行为。

您的错误与最大连接数无关,而是与最大游标数有关。

游标实际上是指向数据库服务器内内存地址的指针,该地址使服务器能够查找游标正在执行的查询和游标的当前状态。

您的代码连接并打开游标,但无论出于何种原因,它都没有关闭游标。当你关闭一个连接时,它会自动关闭所有光标;但是,当您将连接返回到连接池时,它会保持连接处于打开状态,以便可以重用(因为它不会关闭连接,所以不会自动关闭所有游标(。

最好的做法是,当您打开一个游标时,当您完成对它的读取时,它是关闭的,如果在执行游标的过程中出现错误,阻止了正常的执行路径,那么当您捕捉到异常时,游标是关闭的。

您需要调试代码,并确保关闭所有打开的游标。

相关内容

  • 没有找到相关文章

最新更新