У меня есть несколько потоков, обращающихся к одной и той же базе данных (с одинаковой строкой соединения).Каждый поток:
- создает свой собственный экземпляр SqlConnection с использованием той же строки подключения
использует код ниже, чтобы открыть свой собственный экземпляр подключения, когда ему нужен один
try
{
wasOpened = connection.State == ConnectionState.Open;
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
}
catch (Exception ex)
{
throw new Exception(string.Format("Connection to data source {0} can not be established! Reason: {1} - complete stack {2}",
connection.Database, ex.Message, ex.StackTrace == null ? "NULL" : ex.StackTrace.ToString()));
}
Мы уже тестировали этот код на 2 серверах, и один сервер иногда вызывает исключение в методе SqlConnection.Open.Вот сообщение об исключении, которое мы получаем из блока catch:
Невозможно установить соединение с источником данных xyz!Причина: недопустимая операция.Соединение закрыто.- полный стек
в System.Data.SqlClient.SqlConnection.GetOpenConnection ()
в System.Data.SqlClient.SqlConnection.get_Parser ()
в System.Data.SqlClient.SqlConnection.Open ()
Проверка метода SqlConnection.GetOpenConnection показывает, что innerConnection
имеет значение null:
internal SqlInternalConnection GetOpenConnection()
{
SqlInternalConnection innerConnection = this.InnerConnection as SqlInternalConnection;
if (innerConnection == null)
{
throw ADP.ClosedConnectionError();
}
return innerConnection;
}
Мне остается неясным: почему пул соединений иногда дает мне разорванное соединение (innerConnection == null)?
Edit # 1 : в коде нет статических свойств - мы всегда закрываем соединение при необходимости, wasOpened используется в нашем методе Close и означает: если соединение уже былооткрывается, когда вызывается наш Open, просто оставьте его открытым при Close, в противном случае закройте его.Однако это не связано с проблемой, описанной в этом вопросе (innerConnection == null).
Edit # 2 : Сервер: SQL Server 2008 R2, Windows Server 2003. Клиент: Windows Server2003 (код запускается в пользовательском компоненте пакета служб SSIS).Строка подключения: Data Source=server_name;Initial Catalog=db_name;Integrated Security=SSPI;Application Name=app_name