我正在使用NHibernate和ODP.NET连接到Oracle 11g数据库。当然可能存在连接错误(网络故障,DB down,......)。我在我的代码中处理所有这些异常,所以没有问题。但当然用户可以重试他的行为(可能只是一个短暂的网络故障),并且出现了我的问题:
ODP.NET默认使用连接池。通常没问题,但是当用户在连接错误后重试动作时,NHibernate会从ODP.NET获得无效(池化)连接。用户必须多次重试(直到池为空)才能重新运行。
当然我可以在ODP.NET中禁用连接池,但我想避免这种情况。我还读到了一个设置,它检查来自池的每个返回连接的数据库连接,但是这会为每个连接增加一个额外的往返,我也想避免。
有没有办法配置ODP.NET在任何连接抛出连接异常时自动清除连接池?
答案 0 :(得分:3)
如果您可以使用odac(odp) 11g ,则您已为池设置验证连接。它可以在您使用之前验证连接。
验证连接属性验证来自池的连接。只有在绝对必要时才应使用此属性,因为它会导致数据库往返,以便在将每个连接提供给应用程序之前立即对其进行验证。如果无效连接不常见,开发人员可以创建自己的事件处理程序来检索和验证新连接,而不是使用“验证连接”属性。这通常会提供更好的性能。
如果不够好 - 你可以试试oracle的this文件。
连接池管理
ODP.NET连接池管理提供显式连接池 控制到ODP.NET应用程序。应用程序可以明确清除 连接池中的连接。
使用连接池管理,应用程序可以执行以下操作:
注意:.NET存储过程不支持这些API。明确 使用 ClearPool 方法从连接池建立连接。
清除应用程序中所有连接池中的连接 域,使用 ClearAllPools 方法。
从池中清除连接后,ODP.NET会重新填充池 使用至少具有连接数的新连接 通过连接字符串中的Min Pool Size。新的联系没有 必然意味着池将具有有效连接。例如,如果 调用ClearPool或ClearAllPools时数据库服务器关闭, ODP.NET创建新连接,但这些连接仍然存在 无效,因为他们无法连接到数据库,即使 数据库出现以后。
建议直到调用ClearPool和ClearAllPools 应用程序可以创建有效的连接回数据库。 .NET开发人员可以开发不断检查是否的代码 无法创建有效的数据库连接并调用ClearPool或 一旦这是真的,ClearAllPools。
此外,this post可能会对您有帮助。
<强>更新强>: 正如@MPelletier指出的那样,对于oracle 12 the link is different。
答案 1 :(得分:0)
一般来说,您应该避免尝试为任何ADO.NET提供程序(以及WCF通道 - 一边)操纵连接池。如果应用程序需要在面对底层数据错误时具有弹性(例如,超时,池中的连接断开等),那么您应该实现适当的事务级别以确保数据完整性并重试逻辑以重新执行失败的操作。