强制关闭C#中的oracle连接

jon*_*nii 8 c# oracle

我有一个报告窗口,显示从可能长时间运行的oracle存储过程返回的结果.我的问题是当用户关闭窗口时,与oracle的连接仍然打开,并且可能长时间运行的报告不会被取消.

关闭打开连接的唯一方法是让DBA手动终止它们或让用户退出整个应用程序.

我试过Close从不同的线程调用连接,但这似乎不断阻止.我也试过回滚一个交易,但这也表现出同样的问题.

我担心唯一的解决方案是在不同的进程(或者app域?)中运行查询.

很可能我错过了一些明显的东西,任何帮助都会非常感激.

请阅读

这个问题不是关于在using声明中包装我的连接.它是关于如何强制执行查询的oracle连接关闭.

例:

  • 启动运行查询的线程
  • 将连接对象存放在某处
  • 在连接对象上调用close

    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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

问题是这不会关闭连接,而是调用connection.Close()阻塞等待执行的过程.

flq*_*flq 3

嗯,我在 API 中看不到任何用于中止/取消正在进行的查询的内容。从技术上讲,应该可以使用具有完全权限的第二个会话来识别要中止的会话并对该会话发出终止会话命令。我希望您的原始会话能够在出现某种异常的情况下退出,但我从未尝试过。

这里解释了如何终止会话。

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

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

  • 我已经搞定了这个,效果很好,这为我指明了正确的方向。如果用户需要中止,我正在执行“select sid,serial# from v$session where audsid = sys_context('userenv','sessionid')”,然后执行“alter systemkill session(sid,session)immediate”询问。 (2认同)