我使用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();
}
有一种方法可以在杀死我的应用后立即关闭此连接吗?
驱动程序或连接字符串中有一个配置吗?
答案 0 :(得分:1)
您必须使用using语句
配置conn和cmdusing (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文件。