SqlClient appels de causer un “Thread a été interrompue à SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr paquet)”

Je voudrais vraiment apprécier toutes les suggestions, n'importe comment simple ou complexe, pour m'aider à obtenir ce problème isolé et résolu.

J'ai un peu de code qui génère de petits fichiers de rapport. Pour chaque fichier dans la collection, une procédure stockée est exécutée pour obtenir les données via XML reader (c'est un assez grand jeu de résultats). Quand j'ai créé tout cela, et entra à travers elle, tout est bien. Les fichiers sont générés, pas d'erreurs.

Cette bibliothèque est appelée via l'accès distant, et est hébergé par IIS. Pour le déploiement de la compilation de la bibliothèque et de l'appeler, de ses en mesure de générer des rapports, mais lance une Exception d'Abandon de Thread. Si je attacher le débogueur à l'asp processus de travail, et pas à travers le code, je n'ai pas de problèmes.

De voir que cet échec est assez cohérente, j'ai regardé les similitudes et a constaté que la défaillance se produit sur les différents rapports, mais semble arriver à peu près à la même chronologique point.

Cela me conduisent à penser que c'était un paramètre de délai d'attente que le débogueur est primordial, j'ai fait quelques bruts horaires de l'ensemble du processus (pas le seul morceau de code défaut) et il semble échouer au bout d'environ 200 secondes. Le web.config executionTimeout est définie pour 600 minutes (beaucoup assez haut). Il y a d'autres parties de ce serveur d'application qui nécessitent des transactions COM+ (2 minutes de délai d'attente), mais ce n'est pas l'un d'eux. Je suis à une perte quant à ce délai, il pourrait être frapper (à environ 200 deuxième marque).

La Connexion SQL délai est laissé à la valeur par défaut (le lien s'ouvre avec succès), la commande, le délai est de 300 secondes (il faut seulement 12-15 à la commande exec).

  • Est-il un autre délai que je pourrais être absent?

J'ai couru le générateur de profils SQL, et il montre que le résultat est retourné correctement (toutes les instructions et RPC terminé sans erreurs). L'exécution du code via SSMS fournit des résultats parfaits.

L'aide d'un réflecteur, j'ai percé dans le SNINativeMethodWrapper, et c'est un wrapper pour le code non managé et je ne peux pas voir ce que sa tente de le faire réellement. Je ne peux que supposer (peut-être à tort) que le code a reçu de la TDS à partir de SQL server et le gestionnaire est d'essayer d'obtenir la connexion associée avec le paquet et il ne peut pas.

  • Personne ne sait ce que cette enveloppe est censé faire?
  • Est-il possible de trace /debug ce code pour trouver ce qui est à l'origine de la panne?

J'ai essayé à l'aide de différentes méthodes (ExecScalar, DataAdapter), mais ils utilisent tous ExecuteReader en interne.

J'ai essayé de désactiver le regroupement de connexions et de forcer le client à utiliser la même taille de paquet que le serveur.

  • N'quelqu'un a des idées sur ce que sont les causes de cette ou ce que je peux faire pour isoler et d'essayer de corriger le problème?

C'est le code d'appel où l'exception est générée.

Private Function GetDataAsXmlDoc(ByVal cmd As SqlClient.SqlCommand) As XmlDocument

    Dim _xmlDoc As XmlDocument

    Using _connection As New SqlClient.SqlConnection(GetConnectionString())

        Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
                                 "No cached data found or used. Getting data for report from the database using SQL connection.")

        Dim _xmlReader As XmlReader
        'DataAdapter,ExecuteScalar, ExecuteXmlReader all use ExecuteReader internally and suffer the same problem.'
        'If you dont believe me, reflect it or look at one of the blowed up stack traces. '

        '_connection.ConnectionString += ";Pooling=false;"' 'This has no effect on the ThreadAbort.'
        cmd.Connection = _connection
        cmd.CommandTimeout = 300
        _connection.Open()

        Logging.DebugEvent.Log(String.Format("Connection opened, using packet size of {0}.", _connection.PacketSize))

        _xmlReader = cmd.ExecuteXmlReader() 'Thread aborts in here'

        Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
                                 "Report data recieved from database")

        _xmlDoc = New XmlDocument()
        _xmlDoc.Load(_xmlReader)

        _xmlReader.Close()

    End Using

  Return _xmlDoc

End Function

Pile

Exception String - System.Threading.ThreadAbortException: Thread was being aborted.
   at SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr packet)
   at System.Data.SqlClient.TdsParserStateObject.ProcessSniPacket(IntPtr packet, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteXmlReader()...

OriginalL'auteur StingyJack | 2009-01-08