4

OdbcDataReader クラスと ExecuteReader() メソッドを使用して、メインフレーム DB2 データベースに対して SQL クエリを実行しています。このコードは本番環境にあり、何ヶ月も正常に動作しています。

通常、クエリの実行には 1 ~ 2 分かかります。先週の金曜日、クエリで ThreadAbortException が発生しました。以下は、フォーマットされたスタック トレースです。トレースの ApplicationException は、私の catch ブロックで作成されます。

重要な場合は、クライアントが Web サービス メソッドを呼び出したときにクエリが実行されます。Web サービスは、Windows サービスでホストされます。Web サービスは、soap.tcp プロトコルを使用して Windows サービスでホストされます。

TreadAbortException が発生している理由はありますか?

2 つの例外のスタック トレース。一番上の根本原因。

例外 2: スレッドが中止されました。
C:\WINDOWS\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll 内の System.Data.Common.UnsafeNativeMethods.SQLExecDirectW(OdbcStatementHandle StatementHandle, String StatementText, Int32 TextLength) の System.Threading.ThreadAbortException System.Data.Odbc.OdbcStatementHandle.ExecuteDirect(String commandText) (System.Data.Odbc.OdbcCommand.ExecuteReaderObject) (CommandBehavior 動作、String メソッド、Boolean needReader、Object[] methodArguments、SQL_API odbcApiMethod) (System.Data.Odbc.OdbcCommand)。 MyCompany.MyDatabase.GetFolioList(String sqlWhereClause) の System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior 動作) の ExecuteReaderObject(CommandBehavior 動作、文字列メソッド、Boolean needReader)

例外 1: STAT_CD='V' の Folio 要約リストを取得できません。
MyCompany.MyDatabase.GetFolioList(String sqlWhereClause) の D:\Production\DBGateway\bin\MyDatabase.dll 内の System.ApplicationException。<>c__DisplayClass18.b__17()、MyCompany.WebUtilities.WebServiceBase.WebMethodTemplate[T]( String methodName、String exceptionFormat、WebMethodWorker 1 Worker, StringFormatter1 FormatterMethod)

4

2 に答える 2

4

これが私自身の質問に対する答えです。

Web サービスをホストする場合、Web サービスの呼び出しにかかる時間を監視するプロセスがあります。呼び出しに時間がかかりすぎると、その呼び出しは強制終了され、ThreadAbortException が発生します。タイムアウトを増やすことができます。

ASP.NET の外部で実行されている WSE3 Web サービスの場合、たとえば、soap.tcp としてホストされている場合 (私のように)、構成プロパティは executionTimeoutInSeconds です。

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

ASP.NET でホストされる Web サービスの場合、構成プロパティは executionTimeout です。

<configuration>
<system.web>
            <httpRuntime executionTimeout=”360” />
      </system.web>
</configuration
于 2009-01-07T21:32:44.870 に答える
0

楽観的ロックに起因するデッドロック状況でスレッドが犠牲者として選択された可能性がありますが、その場合、責任のあるレイヤーがそれを処理することを期待していました.

ThreadAbortExceptions は、他のアプリケーションや CLR ホストによるスレッドの中止など、さまざまな原因で発生する可能性があります。あなたのコードは別のアプリケーションによってホストされていますか? (重要な例はSql Serverですが、あなたの場合はそうではないようです。)

于 2008-11-17T20:45:04.193 に答える