繁体   English   中英

在C#中强制关闭oracle连接

[英]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()的调用会阻止等待过程执行。

嗯,我看不到API中的任何内容来终止/取消正在进行的查询。 从技术上讲,应该可以使用第二个具有完全特权的会话来标识要中止的会话,并在该会话上发出kill session命令。 我希望您的原始会话可以通过某种方式纾困,但我从未尝试过。

这里说明了如何终止会话。

在这里回答如何获取会话ID。 您可以在开始长时间运行的查询之前找到一个会话,然后从第二个连接中确切终止该会话应该很容易。

让我们知道它是否有效;)

要查看什么/谁阻止了谁:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM