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