Domanda

Abbiamo un'applicazione che utilizza il driver IBM Informix.Ogni volta che proviamo ad aprire connessioni in parallelo, iniziamo a ricevere errori davvero strani.

Questo è il codice di riproduzione più piccolo che sono riuscito a trovare:

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();
}

A seconda della macchina su cui lo eseguiamo, abbiamo dovuto giocare un po' con il file Count valore per farlo fallire, ma 10 sembra riprodurre l'errore in modo coerente.

Naturalmente questo non è codice di produzione, né il modo in cui gestiamo il threading, ma evidenzia il problema senza introdurre altre variabili.

Questa è l'analisi dello stack delle eccezioni:

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()

La versione di IBM.Data.Informix.dll è 3.00.06000.2.

Questo è stato testato su Windows 7 (32 e 64 bit) e 2008 (64 bit).

È stato utile?

Soluzione

Ho risolto questo problema aggiungendo un "Pooling = false" sulla stringa di connessione.

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";

Altri suggerimenti

Ho chiesto informazioni internamente e ho ricevuto il seguente feedback sul provider IBM Informix ClientSDK .NET:

  1. Il problema non è riproducibile sul nostro computer di sviluppo Windows XP a 32 bit.
  2. L'utente/cliente sta tentando di eseguire l'applicazione su Windows 7.CSDK 3.00 NON è certificato su Windows 7 (e non lo sarà mai).
  3. Il cliente deve eseguire l'aggiornamento alla versione più recente, CSDK 3.50.TC6 (32 bit) o ​​3.50.FC6 (64 bit).Questo è supportato.Tieni presente che CSDK 3.50.xC5 e i fix pack precedenti non supportano Windows 7.

Il provider Informix.NET viene anche definito provider CSDK .NET.È ancora il provider .NET preferito utilizzato dalla maggior parte dei clienti IDS.Il "più recente" provider IBM Common.NET (che funziona con DB2 e IDS utilizzando il protocollo DRDA, invece del protocollo SQLI utilizzato dal provider CSDK .NET) è sicuramente la strategia futura, ma pochi clienti utilizzano effettivamente Common. NET per lo sviluppo di applicazioni IDS.


Dato che non ho sviluppato la risposta, l'ho creata Community Wiki.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top