ThreadAbortException调用OdbcDataReader.ExecuteReader()

时间:2008-11-17 20:24:52

标签: c# .net odbc

我正在使用OdbcDataReader类和ExecuteReader()方法对大型机DB2数据库运行SQL查询。此代码已投入生产,并且已运行数月。

查询通常需要1-2分钟才能执行。在上周五,查询遇到了ThreadAbortException。下面是格式化的堆栈跟踪。跟踪中的ApplicationException是在我的catch块中创建的。

如果重要,则在客户端调用Web服务方法时运行查询。 Web服务托管在Windows服务中。 Web服务使用soap.tcp协议托管在Windows服务中。

为什么会发生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)at   System.Data.Odbc.OdbcStatementHandle.ExecuteDirect(字符串   commandText)at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   行为,String方法,布尔值   needReader,Object [] methodArguments,   SQL_API odbcApiMethod)at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   行为,String方法,布尔值   needReader)at   System.Data.Odbc.OdbcCommand.ExecuteReader(的CommandBehavior   行为)   MyCompany.MyDatabase.GetFolioList(字符串   sqlWhereClause)

     

例外1:无法检索作品集   STAT_CD ='V'的摘要列表。
  System.ApplicationException里面   d:\生产\ DBGateway \ BIN \ MyDatabase.dll   在   MyCompany.MyDatabase.GetFolioList(字符串   sqlWhereClause)at   MyCompany.MyDatabase<> c__DisplayClass18.b__17()   在   MyCompany.WebUtilities.WebServiceBase.WebMethodTemplate [T](字符串   methodName,String exceptionFormat,   WebMethodWorker 1 Worker, StringFormatter 1 FormatterMethod)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在乐观锁定导致死锁情况下,您的线程可能被选为受害者,但在这种情况下,我希望负责的层能够处理它。

ThreadAbortExceptions可能由很多东西引起,包括其他应用程序或CLR主机中止线程。您的代码是否由其他应用程序托管? (开创性的例子是Sql Server,尽管在你的情况下似乎不是这种情况。)