我在使用多个线程同时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 异常,比如这个,这可能是相关的。