Oracle ODP不会关闭已终止应用程序的连接

时间:2015-11-19 19:21:53

标签: c# oracle ado.net

我使用ADO.NET访问Oracle 11数据库。此驱动程序正在使用Oracle.ManagedDataAccess.dll客户端DLL。

如果我执行一条长更新指令并在该指令结束前终止应用程序,则连接将保持打开状态直到指令结束。

例如:

string oradb = "Data Source=myoraserver;Persist Security Info=True;User ID=username;Password=password";

conn = new OracleConnection(oradb);
conn.Open();

OracleCommand cmd = new OracleCommand();

cmd.Connection = conn;

OracleTransaction txn = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
    cmd.CommandText = "update foo set bar = 1";
    cmd.CommandType = CommandType.Text;

    cmd.ExecuteNonQuery();
    txn.Commit();
}
catch (Exception ex)
{
    Console.WriteLine("Message    =  " + ex.Message);
    txn.Rollback();
}

有一种方法可以在杀死我的应用后立即关闭此连接吗?

驱动程序或连接字符串中有一个配置吗?

2 个答案:

答案 0 :(得分:1)

您必须使用using语句

配置conn和cmd
using (var conn = new OracleConnection(oradb)) 
{
    conn.Open();
    using (var cmd = new OracleCommand())
    {
        // Your code
    }
}

答案 1 :(得分:1)

sqlnet.expire_time可能是您想要的,虽然它不会立即终止连接:

  

sqlnet.expire_time参数用于设置时间间隔   分钟,以确定应该发送探测的频率来验证   客户端/服务器连接处于活动状如果你需要确保   连接不会无限期地保持打开(或者直到设定的时间)   操作系统特定的参数),你应该设置一个值   大于0.这可以保护系统免受打开的连接   由于客户端异常终止。

     

当探测器检测到终止连接或连接没有时   使用时间更长,它发出错误信号,导致服务器进程   出口。此设置旨在用于数据库服务器端   连接,通常在任何一个处理多个连接   时间。使用此终止(死)连接检测的限制   功能是:

     
      
  • sqlnet.expire_time不能用于遗留连接。

  •   
  • SQL * Net expire_time探测包将生成其他网络   可能会降低网络性能的流量,具体取决于   连接数。

  •   
  • 取决于正在使用的操作系统,附加服务器   可能需要执行处理以区分连接   探测发生的其他事件。这个开销用于检测   探测事件可能导致网络性能下降。

  •   
     

开启expire_time

     

要设置这些高级功能,只需编辑sqlnet.ora文件即可。   如果您是初学者,请按照以下步骤操作:

     

启动Oracle Network Manager GUI。

     

在GUI导航器窗格中,展开图标Local>轮廓。

     

从右侧窗格的列表中,选择常规。

     

单击“高级”选项卡。

     

接下来,输入要设置的字段或选项的值。

     

完成后,选择文件>将网络配置保存到   将更改写入sqlnet.ora文件。