这是场景...
我们有一个运行最新版本 ODAC(Oracle 客户端)的内部网站。它打开数据库连接,运行存储过程或打包方法,然后断开连接。连接池已打开,我们目前在我们的开发和测试环境中都是 11g 版本,但在我们的生产环境中是 10gR2。这发生在生产上。
几天前,一个进程开始触发 ORA-2020 错误。该过程是从我们内部网站上的网页调用的。用户只需设置一个日期,点击一个按钮,就可以在与网站分开的另一个系统上开始工作。然而,调用本身使用数据库链接来运行函数。
我们搜索了 SQL,发现它只使用了一个数据库链接。而且由于这些链接是基于每个会话的,并且用户没有超过默认限制 4,我们怎么可能收到 ORA-2020 错误。
我们已经运行了许多测试来尝试超过默认限制 4。据我回忆,ODAC 在每次连接后运行一次提交,我似乎无法运行 4 个 DB 链接,然后运行一段 SQL在出现任何错误后直接使用 1 个 DB 链接。我可以提出这个错误的唯一方法是,如果我运行一个带有 4 个 DB 链接的查询,然后是一个函数或一段动态 SQL,其中包含一个数据库链接。我们没有这个问题,因为这个问题是零星的。它并不总是发生。
问题
- 连接池是否有可能允许用户 B 在运行初始进程后使用用户 A 的连接,从而在用户 B 运行具有更多数据库链接的 SQL 语句时添加到打开的链接数?
- 这是我们应该将限制提高到 4 以上的情况吗?增加数量有什么坏处?
- 在断开与数据库的连接之前,我是否需要明确关闭打开的数据库链接?Oracle 文档似乎建议它应该自动发生,但“有时”......不会。