У меня есть несколько потоков, обращающихся к одной и той же базе данных (с той же строкой подключения). Каждый поток:
- создает собственный экземпляр 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)?
Редактировать №1: в коде нет статических свойств - мы всегда закрываем соединение, когда это необходимо, wasOpened используется в нашем методе Close и означает: если соединение уже было открыто при вызове нашего Open, просто оставьте он открывается при закрытии, в противном случае закрывается. Однако это не связано с проблемой, описанной в этом вопросе (innerConnection == null).
Редактировать №2: Сервер: SQL Server 2008 R2, Windows Server 2003. Клиент: Windows Server 2003 (код выполняется внутри пользовательского компонента пакета SSIS). Строка подключения: Data Source=server_name;Initial Catalog=db_name;Integrated Security=SSPI;Application Name=app_name
using-statement
. Здесь что-то статичное? - person Tim Schmelter   schedule 21.03.2012