[英]Force closing an oracle connection in C#
我有一个报告窗口,其中显示了从可能长时间运行的oracle存储过程返回的结果。 我的问题是,当用户关闭窗口时,与oracle的连接保持打开状态,并且可能长时间运行的报告不会被取消。
关闭打开的连接的唯一方法是让DBA手动杀死它们或让用户退出整个应用程序。
我尝试从另一个线程在连接上调用Close
,但这似乎一直处于阻塞状态。 我还尝试回滚事务,但这也存在相同的问题。
我担心唯一的解决方案是在不同的过程(或应用程序域?)中运行查询。
我很可能缺少明显的东西,任何帮助将不胜感激。
请阅读
这个问题不是关于将我的连接包装在using
语句中。 关于如何强制执行查询的oracle连接关闭 。
例:
在连接对象上调用关闭
public void Go() { OracleConnection connection; var queryThread = new Thread( () => { using (connection = OpenOracleConnection()) { // execute stored proc that takes 45 mins // raise an event with the data set we load } }); Thread.Sleep(3000); // give it time to be useless var closeThread = new Thread( () => { connection.Close(); }); closeThread.Start(); }
问题在于这不会关闭连接,而是对connection.Close()的调用会阻止等待过程执行。
要查看什么/谁阻止了谁:
select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2;
与.NET中的任何提供程序一样,您可以调用Dispose
using(var conn = /* your connection */) {
// do your stuff
conn.Close();
} // this will automatically call .Dispose()
这就是您需要做的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.