IfxConnection和线程可以相处吗?

时间:2010-03-11 16:22:44

标签: .net multithreading informix

我们有一个使用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位)上测试的。

2 个答案:

答案 0 :(得分:1)

我在内部询问了这个问题,并获得了有关IBM Informix ClientSDK .NET提供程序的以下反馈:

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

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


由于我没有得到答案,我已将其作为社区维基。

答案 1 :(得分: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";