如何清除连接错误时的ODP.NET连接池?

| 我正在使用NHibernate和ODP.NET连接到Oracle 11g数据库。当然,可能会出现连接错误(网络故障,数据库关闭等)。我正在代码中处理所有这些异常,因此没有问题。但是,当然,用户可以重试其操作(也许只是短暂的网络故障),这就是我的问题: 默认情况下,ODP.NET使用连接池。通常,这没有问题,但是当用户在连接错误后重试操作时,NHibernate从ODP.NET获得无效(池化)连接。用户必须多次重试(直到池为空)才能使其再次工作。 当然我可以在ODP.NET中禁用连接池,但是我想避免这种情况。我还阅读了有关设置的信息,该设置针对池中每个返回的连接检查与DB的连接,但这也为我希望避免的每个连接增加了一次往返。 有什么方法可以将ODP.NET配置为在任何连接引发连接异常时自动清除连接池吗?
已邀请:
如果可以使用odac(odp)11g,则需要为池设置“验证连接”。在使用之前,它可以验证连接。 验证连接属性验证从池中出来的连接。仅在绝对必要时才应使用此属性,因为它会导致数据库往返并在将每个连接提供给应用程序之前立即对其进行验证。如果无效连接不常见,则开发人员可以创建自己的事件处理程序来检索和验证新连接,而不必使用Validate Connection属性。这通常可以提供更好的性能。 如果不够好-您可以从oracle尝试使用此文档。 连接池管理 ODP.NET连接池管理提供了显式连接池 对ODP.NET应用程序的控制。应用程序可以明确清除 连接池中的连接。 使用连接池管理,应用程序可以执行以下操作: 注意:.NET存储过程不支持这些API。明确 使用ClearPool方法从连接池进行连接。 清除应用程序中所有连接池中的连接 域,使用ClearAllPools方法。 从池中清除连接后,ODP.NET将重新填充池 具有至少具有设置的连接数的新连接 通过连接字符串中的“最小池大小”。新连接不 必然意味着该池将具有有效的连接。例如,如果 调用ClearPool或ClearAllPools时数据库服务器已关闭, ODP.NET创建新的连接,但是这些连接仍然 无效,因为它们无法连接到数据库,即使 数据库稍后出现。 建议不要调用ClearPool和ClearAllPools,直到 应用程序可以创建返回数据库的有效连接。 .NET开发人员可以开发代码来连续检查是否 不能创建有效的数据库连接,然后调用ClearPool或 如果这是事实,那么ClearAllPools。 另外,可能这篇文章会对您有所帮助。 更新: 如@MPelletier所指出的,对于oracle 12,链接是不同的。
一般来说,您应该避免尝试为任何ADO.NET提供程序(以及WCF通道-顺便说一句)操纵连接池。如果您的应用程序需要面对潜在的数据错误(例如超时,池中的连接断开等),具有弹性,则应实施适当的事务级别以确保数据完整性并重试逻辑以重新执行失败的操作。

要回复问题请先登录注册