2008-11-17 3 views
3

Je cours une requête SQL sur une base de données mainframe DB2 en utilisant la classe OdbcDataReader et la méthode ExecuteReader(). Ce code est en production et fonctionne correctement depuis des mois.ThreadAbortException appel OdbcDataReader.ExecuteReader()

La requête prend normalement 1-2 minutes à exécuter. Vendredi dernier, la requête a rencontré une exception ThreadAbortException. Voici la trace de la pile formatée. L'exception ApplicationException dans la trace est créée dans mon bloc catch.

Dans le cas où cela est important, la requête est exécutée lorsqu'un client appelle une méthode de service Web. Le service Web est hébergé dans un service Windows. Le service Web est hébergé dans un service Windows à l'aide du protocole soap.tcp.

Avez-vous des idées sur la raison de l'exception TreadAbortException?

Trace de pile pour 2 exception (s). Racine cause au sommet.

Exception 2: Le fil était en cours d'abandon.
System.Threading.ThreadAbortException intérieur C: \ Windows \ assembly \ GAC_64 \ System.Data \ 2.0.0.0__b77a5c561934e089 \ System.Data.dll à System.Data.Common.UnsafeNativeMethods.SQLExecDirectW (OdbcStatementHandle StatementHandle, chaîne StatementText, Int32 TextLength) à System.Data.Odbc.OdbcStatementHandle.ExecuteDirect (string commandText) à System.Data.Odbc.OdbcCommand.ExecuteReaderObject (comportement CommandBehavior , méthode string, Boolean needReader, objet [] methodArguments , SQL_API odbcApiMethod) à System.Data.Odbc.OdbcCom mand.ExecuteReaderObject (CommandBehavior comportement, méthode String, Boolean needReader) à System.Data.Odbc.OdbcCommand.ExecuteReader (CommandBehavior Comportement ) à MyCompany.MyDatabase.GetFolioList (String SQLWhereClause)

Exception 1: Impossible de récupérer la liste récapitulative du folio où STAT_CD = 'V'.
System.ApplicationException intérieur D: \ production \ DBGateway \ bin \ MyDatabase.dll à MyCompany.MyDatabase.GetFolioList (String SQLWhereClause) à MyCompany.MyDatabase. <> c__DisplayClass18.b__17() à MyCompany.WebUtilities.WebServiceBase.WebMethodTemplate [T] (String methodName, String exceptionFormat, WebMethodWorker 1 Worker, StringFormatter 1 FormatterMethod)

Répondre

3

Voici la réponse à ma propre question.Lors de l'hébergement d'un service Web, un processus surveille la durée d'un appel de service Web. Si un appel prend trop de temps, il est détruit et ThreadAbortException se produit. Le délai d'attente peut être augmenté.

Pour un service Web WSE3 exécuté en dehors d'ASP.NET, par ex. organisé comme soap.tcp (comme le mien), la propriété de configuration est executionTimeoutInSeconds:

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

Pour un service Web hébergé dans ASP.NET, la propriété de configuration est executionTimeout:

<configuration> 
<system.web> 
      <httpRuntime executionTimeout=”360” /> 
     </system.web> 
</configuration 
0

Il est possible que votre fil a été choisi comme la victime dans une situation de blocage résultant d'un verrouillage optimiste, bien que dans ce cas, je m'attendais à ce que la couche responsable le gère.

ThreadAbortExceptions peut être causée par de nombreuses choses, y compris d'autres applications ou l'hôte CLR interrompant le thread. Votre code est-il hébergé par une autre application? (L'exemple séminal serait Sql Server, bien que cela ne semble pas être la situation dans votre cas.)

+0

Merci pour la réponse. Comme mentionné dans la question, le thread est en cours d'exécution dans un service Web hébergé dans un service Windows. Un peu étrange, mais vrai. –