Могут ли IfxConnection и Threading обойтись? - PullRequest
3 голосов
/ 11 марта 2010

У нас есть приложение, использующее драйвер 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 ]

1 голос
/ 09 апреля 2010

Я решил эту проблему, добавив «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";
1 голос
/ 12 марта 2010

Я спросил об этом внутри и получил следующий отзыв о провайдере IBM Informix ClientSDK .NET:

  1. Эта проблема не воспроизводится на нашем 32-разрядном компьютере для разработки под Windows XP.
  2. Пользователь / клиент пытается запустить приложение в Windows 7. CSDK 3.00 НЕ сертифицирован в Windows 7 (и никогда не будет).
  3. Клиент должен обновить систему до последней версии, CSDK 3.50.TC6 (32-разрядная версия) или 3.50.FC6 (64-разрядная версия). То есть поддерживается . Обратите внимание, что CSDK 3.50.xC5 и более ранние пакеты исправлений не поддерживают Windows 7.

Поставщик Informix.NET также называется поставщиком CSDK .NET. Это все еще предпочтительный поставщик .NET, используемый большинством клиентов IDS. «Последний» поставщик IBM Common.NET (который работает с DB2, а также с IDS, использующим протокол DRDA вместо протокола SQLI, используемого поставщиком CSDK .NET), определенно является будущей стратегией, но на самом деле лишь немногие клиенты используют Common. NET для разработки приложений IDS.


Поскольку я не разработал ответ, я сделал его вики-сообществом.

...