我有一个 C# Windows IIS 服务器 (Windows Server 2003) 应用程序连接到托管在 Linux 上的 Oracle 数据库(Red Hat 5.3 上的 10gR2)。Oracle 会间歇性地抛出 ORA-3113: end-of-file on communication channel 错误。这搞砸了 C# 中的 OracleConnection 对象。然后,任何尝试使用 OracleConnection 的新 OracleCommands 都失败,说明连接已关闭。
我已经查看了此错误生成的 Oracle 跟踪文件,并将问题与网络硬件故障隔离开来,并正在努力修复它。
但是,我需要使我的 C# 代码更健壮,并通过关闭并且不再使用该连接对象来适当地响应此错误。在 C# 中很容易捕获异常,但我无法在开发环境中重现网络问题以证明我的代码可以正常工作并自行清理。
try
{
oracleCommand.ExecuteNonQuery();
}
catch(OracleException exception)
{
if(exception.Code == 3113)
CloseAndCleanup();
}
我尝试在表上编写一个 PL/SQL 触发器,当我尝试将其插入表中时会引发 ORA-3113。
CREATE OR REPLACE TRIGGER SCHEMA.TABLE
BEFORE DELETE OR INSERT OR UPDATE
ON SCHEMA.TABLE
FOR EACH ROW
DECLARE
CONNECTION_LOST_CONTACT EXCEPTION;
PRAGMA EXCEPTION_INIT (CONNECTION_LOST_CONTACT, -3113);
BEGIN
RAISE CONNECTION_LOST_CONTACT;
END;
这会引发正确的错误,但不会破坏 C# 中的 OracleConnection 对象。我仍然可以向 OracleConnection 发送命令并且它可以工作。
如何准确模拟 ORA-3113 错误?