|
Ошибка в недрах ADO.NET
|
|||
---|---|---|---|
#18+
Сначала о рабочем окружении: Есть сервер приложений (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 или еще где-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2004, 17:55 |
|
|
start [/forum/topic.php?fid=17&fpage=125&tid=1353993]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
2ms |
others: | 375ms |
total: | 504ms |
0 / 0 |