cre*_*mor 14 oracle nhibernate ado.net connection-pooling odp.net
我正在使用NHibernate和ODP.NET连接到Oracle 11g数据库.当然可能存在连接错误(网络故障,DB down,......).我在我的代码中处理所有这些异常,所以没有问题.但是当然用户可以重试他的行为(可能只是一个短暂的网络故障),并且出现了我的问题:
ODP.NET默认使用连接池.通常没问题,但是当用户在连接错误后重试动作时,NHibernate会从ODP.NET获得无效(池化)连接.用户必须多次重试(直到池为空)才能重新运行.
当然我可以在ODP.NET中禁用连接池,但我想避免这种情况.我还读到了一个设置,它检查来自池的每个返回连接的数据库连接,但这会为每个连接增加一个额外的往返,我也想避免.
有没有办法配置ODP.NET在任何连接抛出连接异常时自动清除连接池?
如果您可以使用 odac (odp) 11g,则您已为池设置了“验证连接”。它可以在使用之前验证连接。
验证连接属性验证来自池的连接。仅当绝对必要时才应使用此属性,因为它会导致数据库往返以在将每个连接提供给应用程序之前立即对其进行验证。如果无效连接并不常见,开发人员可以创建自己的事件处理程序来检索和验证新连接,而不是使用“验证连接”属性。这通常可以提供更好的性能。
如果它还不够好 - 您可以尝试Oracle 的此文档。
连接池管理
ODP.NET 连接池管理为 ODP.NET 应用程序提供显式连接池控制。应用程序可以显式清除连接池中的连接。
使用连接池管理,应用程序可以执行以下操作:
注意:.NET 存储过程不支持这些 API。使用ClearPool方法清除连接池中的连接。
使用ClearAllPools方法清除应用程序域中所有连接池中的连接。
从池中清除连接后,ODP.NET 会使用新连接重新填充池,新连接的连接数至少达到连接字符串中“最小池大小”设置的连接数。新连接并不一定意味着池将具有有效连接。例如,如果调用 ClearPool 或 ClearAllPools 时数据库服务器关闭,ODP.NET 会创建新连接,但这些连接仍然无效,因为它们无法连接到数据库,即使数据库稍后重新启动也是如此。
建议在应用程序可以创建返回数据库的有效连接之前不要调用 ClearPool 和 ClearAllPools。.NET 开发人员可以开发代码来持续检查是否可以创建有效的数据库连接,并在成立时调用 ClearPool 或 ClearAllPools。
另外,也许这篇文章会对您有所帮助。
更新:正如 @MPelletier 所指出的,对于 oracle 12,链接是不同的。
归档时间: |
|
查看次数: |
8065 次 |
最近记录: |