C# Oracle托管ODP.NET:由于网络错误,连接被强制关闭

C# Oracle托管ODP.NET:由于网络错误,连接被强制关闭,c#,.net,database,oracle,odp.net,C#,.net,Database,Oracle,Odp.net,我使用OracleODP.NET连接器连接到Oracle数据库服务器 问题是连接有时会由于几个不同的问题(如网络故障或服务器被对等方强行关闭连接)而丢失。 这会导致未捕获异常,因为在查询中未使用连接对象时或在应用程序空闲时,我无法捕获异常 问题是,当连接丢失时,如何捕获Oracle连接异常? 是否有任何回调技术或其他方法可以通知我断开连接?请参阅我在连接池连接字符串中关于Validate Connection=true的评论 您还可以编写自己的“connection tester”例程,对数据库

我使用
Oracle
ODP.NET
连接器连接到
Oracle
数据库服务器

问题是连接有时会由于几个不同的问题(如网络故障或服务器被对等方强行关闭连接)而丢失。 这会导致未捕获异常,因为在查询中未使用连接对象时或在应用程序空闲时,我无法捕获异常

问题是,当连接丢失时,如何捕获Oracle连接异常?
是否有任何回调技术或其他方法可以通知我断开连接?

请参阅我在连接池连接字符串中关于Validate Connection=true的评论

您还可以编写自己的“connection tester”例程,对数据库执行“Select sysdate from dual”以测试连接

这两种解决方案都需要往返数据库。这两种解决方案都不能完全防止网络错误,因为它们可能在您测试后立即发生

底线是,如果您不希望出现未处理的异常,则在使用ODP.NET对象的任何时候都需要捕获异常

没有可用的回调机制可以防止这种情况


我真的不明白你是怎么说当你不使用odp.net对象时会出现异常的。如果您遇到异常,那么此时您必须使用odp.net对象,因此您可以在代码中捕获异常。

您能告诉我们您为什么需要这个吗?无论如何,您都没有使用连接,一旦尝试使用,您就会知道存在问题。在我的应用程序中,许多地方都使用了单个连接对象。我想确保连接在使用时是有效的。我必须编辑大量代码行,以便捕获和修复断开连接(如果没有其他方法,我会这样做)。因此,我想截获断开连接异常,并尝试再次恢复连接,以便其他地方(使用连接对象的地方)甚至不会注意到断开连接发生在一秒钟之前。当发生断开连接时,会发生什么情况?当连接断开时,连接对象会处于什么状态?在使用OracleConnection连接池后,是否可以简单地将连接返回到该连接池,并在需要时获取另一个连接池?很容易配置连接池,以确保其分配的连接始终有效。(使用Validate Connection=true)您的问题从根本上说是由于反复使用单个连接对象造成的。您应该在using语句中创建每个连接对象,以便尽快处理它。谢谢!我明白了。