我正在尝试用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调高,则错误出现的时间会更长,但最终还是会发生错误。
我对连接池的期望是等待调用Connect以获得新的连接,而不是在已经连接的适配器上填充失败(尽管我知道Connection对象正在使用池,所以可能不是这样)。无论如何,这是一种奇怪的行为。
1条答案
按热度按时间qvtsj1bj1#
您的错误不是与最大连接数有关,而是与最大游标数有关。
游标实际上是指向数据库服务器中的内存地址的指针,该地址允许服务器查找游标正在执行的查询和游标的当前状态。
您的代码正在连接然后打开游标,但无论出于何种原因,它都没有关闭游标。当您关闭连接时,它将自动关闭所有游标;但是,当您将连接返回到连接池时,它会使连接保持打开状态,以便可以重复使用(因为它不会关闭连接,所以不会自动关闭所有游标)。
最佳做法是确保当您打开游标时,它在您完成对它的读取时关闭,如果游标在执行过程中出现错误,这将阻止正常的执行路径,然后在捕获异常时关闭游标。
您需要调试代码,并确保关闭所有打开的游标。