背景
我们有一个 C#/VB.net 客户端应用程序使用连接到 Oracle 数据库的 WCF 服务。Web 服务使用 .NET 框架的 Oracle 数据提供程序连接到数据库(不要与 ODP 混淆)。我们的测试人员经历了偶发的 Oracle 帐户锁定,这似乎是在更改用户的 Oracle 密码后不久发生的。dba_audit_trail 日志显示了在没有任何用户或客户端活动的情况下,似乎以非常固定的时间间隔(即每两分钟一次)自动连接尝试。许多日志(IIS、WCF 跟踪、消息日志等)已确认这些连接尝试不是由客户端应用程序直接发起的;它们必须独立于 Web 服务或 System.Data.OracleClient 库内部。
在某些情况下,这些自动尝试在密码更改之前开始,并且它们成功连接到数据库,但是一旦密码更改,下一次尝试会因用户名/密码无效而失败。尝试三次后,帐户被锁定。我们正试图找到这些周期性连接尝试的来源。
我在此处的 Oracle 论坛上发现了一个非常相似但未得到解答的问题。
当前的想法
我们最近的调查使我们相信这是连接池的意外行为。如果用户在密码更改之前连接到 Web 服务,则会为原始连接字符串创建一个连接池。更改密码并重新登录 Web 服务后,数据提供者将根据新的连接字符串创建一个新的连接池。
数据提供者内部的某些东西是否会试图使旧连接与第一个连接池保持活动状态?也许第一个连接池正在丢弃旧连接并尝试用新连接(现在无效的连接字符串)来补充它。什么可能导致这种情况?注意:我们使用最小/最大池大小 (0/100) 的默认设置。
我们不相信我们的代码直接尝试从第一个连接池访问连接。用户的会话没有任何关于前一个会话密码的记忆,因此不会使用旧的连接字符串来引用第一个连接池。此外,我们的代码中没有任何内容可以解释我们所看到的非常精确的连接间隔。