当多个线程同时访问时,Odp.net连接池失败(ORA-24550:收到的信号:未处理的异常:代码= e0434f4d)

时间:2013-11-08 02:33:51

标签: .net oracle odp.net

我在多个线程的同时Open()多个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秒后,这是Connection Timeout,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声明中发表评论,一切都很好。我尝试了50ms,但这还不够。在每个OracleConnection.Open()之前进行100毫秒的睡眠,以防万一,显然不是一个高效的解决方案。

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

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

Fwiw,谷歌说还有其他人有相同的.net例外like this one,这可能是相关的。

0 个答案:

没有答案