3

我在使用多个线程同时Open()处理多个s 时遇到问题。OracleConnection

示例 A是一个单线程示例,可以正常工作:

for (int i = 0; i < 100; i++)
{
    OracleConnection oracon = new OracleConnection(oraconstr);
    oracon.Open();
}

(我不是在这里故意关闭连接,因为我试图删除我遇到此问题的现实生活示例)

用于netstat检查到 Oracle 服务器的实际 TCP 连接数确认确实有 100 个连接已建立并且在循环完成后处于活动状态。

示例 B做同样的事情,只是有多个线程:

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(
        state =>
        {
            OracleConnection oracon = new OracleConnection(oraconstr);
            oracon.Open();
        });
    // Thread.Sleep(100);
}

在多线程情况下,只netstat显示一个活动的 TCP 连接,除了幸运的第一个线程赢得“Open() 竞赛”,所有其他线程在调用 时都被阻塞Open(),并且在 15 秒后,即连接超时,odp.net 最终会抛出

Oracle.DataAccess.Client.OracleException Connection request timed out

异常并抛出此原生异常,这将使应用程序实际崩溃:

ORA-24550: signal received: Unhandled exception: Code=e0434f4d Flags=1

kpedbg_dmp_stack()+428<-kpeDbgCrash()+102<-kpeDbgSignalHandler()+123<-skgesig_Win_UnhandledExceptionFilter()+173<-0000000077A49380<-0000000077B6573C<-0000000077AE5148<-0000000077B0554D<-0000
000077AE5D1C<-0000000077AE62EE<-000007FEFDD7AA7D<-000007FEE7E6F0BD<-000007FEE8422ED0<-000007FF001AB805<-000000000268A4B8<-00000000FFFFFC18

如果我在Thread.Sleep上面的声明中发表评论,一切都很好。我尝试了 50 毫秒,但这还不够。OracleConnection.Open()为了以防万一,在每个 之前进行 100 毫秒睡眠显然不是一个高效的解决方案。

知道这里发生了什么以及如何解决或解决这个问题吗?(当然除了直接与 Oracle 交谈,我会在发布此问题后尝试这样做)

这是 .net 3.5,使用 Oracle.DataAccess.dll 版本 2.112.1.0。我还测试了 2.112.3.0 - 结果相同。

Fwiw,谷歌说还有其他人有同样的 .net 异常,比如这个,这可能是相关的。

4

0 回答 0