我正在使用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, WebMethodWorker1 Worker, StringFormatter
1 FormatterMethod)
答案 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,尽管在你的情况下似乎不是这种情况。)