Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ошибка в недрах ADO.NET / 1 сообщений из 1, страница 1 из 1
18.10.2004, 17:55
    #32743262
stranger2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в недрах ADO.NET
Сначала о рабочем окружении:

Есть сервер приложений (IIS 6.0 под Windows 2003 Server Enterprise Edition, .Net Framework 1.1 SP1), на котором размещен ряд бизнес-компонентов, доступных по протоколу .Net Remoting.

На том же самом сервере установлена БД MS SQL 2000 SP3. Для связи сервера приложений с БД используется Integrated security.

Строка подключения к базе имеет следующий вид:
<add key="Database" value="data source=APPSERVER;initial catalog=Database;Persist Security Info=False;Integrated Security=SSPI;" />

В коде встречаются транзакции, охватывающие вызовы методов нескольких бизнес-компонентов, для реализации таких транзакций используются средства Enterprise Services Without Components:

ServiceConfig serviceConfig = new ServiceConfig();
serviceConfig.Transaction = TransactionOption.Required;
try
{
ServiceDomain.Enter(serviceConfig);
...
ContextUtil.SetComplete();
}
catch (Exception ex)
{
ContextUtil.SetAbort();
throw ex;
}
finally
{
ServiceDomain.Leave();
}



Теперь о проблеме:

Периодически возникает ошибка при открытии соединения с MS SQL в методах бизнес-компонентов, охваченных бизнес-транзакцией. Вот что получается в stack trace:

Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: System.Data
at System.Data.Common.Dbnetlib.ConnectionWrite(HandleRef pConnectionObject, Byte[] buffer, UInt16 writecount, IntPtr& errno)
at System.Data.SqlClient.TdsParser.FlushBuffer(Byte status)
at System.Data.SqlClient.TdsParser.PropagateDistributedTransaction(Byte[] buffer, Int32 length, Int32 timeout)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNullDistributedTransaction(ITransaction transaction)
at System.Data.SqlClient.SqlInternalConnection.EnlistDistributedTransaction(ITransaction newTransaction, Guid newTransactionGuid)
at System.Data.SqlClient.SqlInternalConnection.EnlistDistributedTransaction()
at System.Data.SqlClient.SqlInternalConnection.Activate(Boolean isInTransaction)
at System.Data.SqlClient.SqlConnection.Open()



Причем ошибка возникает не всегда, а именно периодически. Т.е. воспроизвести ее при тестовом вызове не всегда получается. Судя по всему, возникновение ошибки более вероятно в моменты повышенной нагрузки на сервер. Например, при импорте данных из внешних систем может последовательно выполняться ~5000 бизнес-транзакций.

Соответственно, пока не очень понятно, в чем может быть проблема, а главное, как диагностировать источник ошибки? Очевидных причин для возникновения ошибки я не вижу - работа с БД ведется очень аккуратно, все соединения открываются на короткий период вызова в блоках using (SqlConnection connection = new SqlConnection(...)), т.е. утечки соединений из-за ошибки в коде быть не может.

Может быть, причина в особенностях вызовов MSDTC под Windows 2003? Вообще, какие средства диагностики можно использовать в такой ситуации? Нужно понять, на каком уровне возникают проблемы - на уровне .Net Framework, на уровне MSDTC, на уровне MS SQL или еще где-то.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ошибка в недрах ADO.NET / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]