IfxConnection 和线程可以相处吗?

Posted

技术标签:

【中文标题】IfxConnection 和线程可以相处吗?【英文标题】:Can IfxConnection and threading get along? 【发布时间】:2010-03-11 16:22:44 【问题描述】:

我们有一个使用 IBM Informix 驱动程序的应用程序。每当我们尝试并行打开连接时,我们就会开始遇到一些非常奇怪的错误。

这是我能想到的最小的复制代码:

const int Count = 10;
const string ConnectionString = "Host=the_host;Service=the_service;Server=the_server;Database=the_database;User ID=the_user_id;Password=the_password";

static void Main()

    var threads = new Thread[Count];
    for (var i = 0; i < threads.Length; i++)
    
        threads[i] = new Thread(
            number =>
            
                using (var conn = new IfxConnection(ConnectionString))
                
                    Console.WriteLine("Opening connection 0... ", number);
                    try
                    
                        conn.Open();
                        Console.WriteLine("Opened connection 0", number);
                        var setLockCommand = conn.CreateCommand();
                        setLockCommand.CommandText = "set lock mode to wait 10;";
                        setLockCommand.ExecuteNonQuery();
                        Console.WriteLine("Releasing connection 0", number);
                    
                    catch (IfxException ex)
                    
                        Console.WriteLine("Failed opening connection 0: 1", number, ex);
                    
                
            );
        threads[i].Start(i);
    
    foreach (var thread in threads)
        thread.Join();

根据我们在哪台机器上运行它,我们不得不稍微调整一下Count 值以使其失败,但 10 似乎始终如一地重现错误。

当然,这不是生产代码,也不是我们处理线程的方式,但它在没有引入任何其他变量的情况下突出了问题。

这是异常堆栈跟踪:

IBM.Data.Informix.IfxException: ERROR [HY000] [Informix .NET provider]General error.
   at IBM.Data.Informix.IfxConnection.GetConnectAttr(SQL_ATTR attribute, HANDLER handler)
   at IBM.Data.Informix.IfxConnection.ConnectionIsAlive()
   at IBM.Data.Informix.IfxConnectionPool.BindNodeToConnection(IfxConnPoolNode poolNode, IfxConnection connection, ConnectionPoolType ConnPoolType)
   at IBM.Data.Informix.IfxConnectionPool.Open(IfxConnection connection)
   at IBM.Data.Informix.IfxConnPoolManager.Open(IfxConnection connection)
   at IBM.Data.Informix.IfxConnection.Open()

IBM.Data.Informix.dll 版本为 3.00.06000.2。

这是在 Windows 7(32 位和 64 位)和 2008(64 位)上测试的。

【问题讨论】:

【参考方案1】:

我解决了这个问题,在连接字符串上添加了“Pooling=false”。

const string ConnectionString = "Host=the_host;Service=the_service;Server=the_server;Database=the_database;User ID=the_user_id;Password=the_password;Pooling=false";

【讨论】:

可能可以工作,但禁用池的性能损失可能太大了。【参考方案2】:

我在内部询问过这个问题,得到以下关于 IBM Informix ClientSDK .NET 提供商的反馈:

    在我们的 Windows XP 32 位开发机器上无法重现该问题。 用户/客户正在尝试在 Windows 7 上运行应用程序。CSDK 3.00 未在 Windows 7 上获得认证(永远不会)。 客户应升级到最新版本,CSDK 3.50.TC6(32 位)或 3.50.FC6(64 位)。那是supported。请注意,CSDK 3.50.xC5 和更早的修复包不支持 Windows 7。

Informix.NET 提供程序也称为 CSDK .NET 提供程序。它仍然是大多数 IDS 客户使用的首选 .NET 提供程序。 “最新”的 IBM Common.NET 提供程序(它与 DB2 以及使用 DRDA 协议的 IDS 一起工作,而不是 CSDK .NET 提供程序使用的 SQLI 协议)绝对是未来的战略,但实际上很少有客户使用 Common。 NET 用于 IDS 应用程序开发。


由于我没有开发答案,所以我将其制作为 Community Wiki。

【讨论】:

感谢您的研究!但我 AM 使用 CSDK 3.50.TC6(那是那里的版本号,我不希望在这一点上保持一致性 :-)) 好的 - 如果可能,请将您的问题提交给 IBM 技术支持。

以上是关于IfxConnection 和线程可以相处吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以停止此重定向吗? formsubmit.co

和领导相处的10条法则,越早知道越好

和人相处

NLP悦读 | 余生,只求相处不累

PHP 类型提示与接口和抽象类不相处?

有啥方法可以区分主线程和它产生的任何线程吗?