ThreadAbortException, вызывающий OdbcDataReader.ExecuteReader () - PullRequest
4 голосов
/ 17 ноября 2008

Я выполняю SQL-запрос к базе данных DB2 мэйнфрейма, используя класс OdbcDataReader и метод ExecuteReader (). Этот код находится в производстве и работает в течение нескольких месяцев.

Запрос обычно выполняется в течение 1-2 минут. В прошлую пятницу запрос обнаружил исключение ThreadAbortException. Ниже приведена отформатированная трассировка стека. ApplicationException в трассировке создается в моем блоке catch.

Если это важно, запрос выполняется, когда клиент вызывает метод веб-службы. Веб-сервис размещен в службе Windows. Веб-служба размещается в службе Windows с использованием протокола soap.tcp.

Есть идеи, почему происходит исключение TreadAbortException?

Трассировка стека для 2 исключений. корень причина наверху.

Исключение 2: поток был прерван.
System.Threading.ThreadAbortException внутри C: \ WINDOWS \ сборка \ GAC_64 \ System.Data \ 2.0.0.0__b77a5c561934e089 \ System.Data.dll в System.Data.Common.UnsafeNativeMethods.SQLExecDirectW (OdbcStatementHandle StatementHandle, String StatementText, Int32 TextLength) в System.Data.Odbc.OdbcStatementHandle.ExecuteDirect (String commandText) в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (CommandBehavior поведение, метод String, логическое значение NeedReader, Object [] methodArguments, SQL_API odbcApiMethod) в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (CommandBehavior поведение, метод String, логическое значение NeedReader) в System.Data.Odbc.OdbcCommand.ExecuteReader (CommandBehavior поведение) в MyCompany.MyDatabase.GetFolioList (String sqlWhereClause)

Исключение 1: невозможно получить фолио сводный список, где STAT_CD = 'V'.
System.ApplicationException внутри D: \ Производство \ DBGateway \ Bin \ MyDatabase.dll в MyCompany.MyDatabase.GetFolioList (String sqlWhereClause) в MyCompany.MyDatabase. <> C__DisplayClass18.b__17 () в MyCompany.WebUtilities.WebServiceBase.WebMethodTemplate [Т] (Строка methodName, String exceptionFormat, WebMethodWorker 1 Worker, StringFormatter 1 FormatterMethod)

Ответы [ 2 ]

4 голосов
/ 08 января 2009

Вот ответ на мой вопрос.

При размещении веб-службы существует некоторый процесс, отслеживающий, сколько времени занимает вызов веб-службы. Если вызов занимает слишком много времени, он прерывается и возникает исключение ThreadAbortException. Время ожидания может быть увеличено.

Для веб-службы WSE3, работающей вне ASP.NET, например размещается как soap.tcp (как и у меня), свойство конфигурации имеет значение executeTimeoutInSeconds:

<configuration>
  <microsoft.web.services3>
    <messaging>
      <executionTimeoutInSeconds value="360" />
    </messaging>
  </microsoft.web.services3>
</configuration>

Для веб-службы, размещенной в ASP.NET, свойство конфигурации имеет значение executeTimeout:

<configuration>
<system.web>
            <httpRuntime executionTimeout=”360” />
      </system.web>
</configuration
0 голосов
/ 17 ноября 2008

Вполне возможно, что ваш поток был выбран в качестве жертвы в ситуации взаимоблокировки, вызванной оптимистической блокировкой, хотя в этом случае я бы ожидал, что ответственный уровень обработает ее.

Исключения ThreadAbortException могут вызываться многими причинами, в том числе другими приложениями или хостом CLR, прерывающим поток. Ваш код размещен в другом приложении? (Исходным примером будет Sql Server, хотя в вашем случае ситуация не такая.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...