SqlClient Anrufe zu verursachen „Thread bei SNINativeMethodWrapper.SNIPacketGetConnection abgebrochen wurde (IntPtr Paket)“

StackOverflow https://stackoverflow.com/questions/424531

Frage

Ich würde wirklich irgendwelche Vorschläge zu schätzen wissen, egal wie einfach oder komplex, mir zu helfen, dieses Problem zu bekommen isoliert und gelöst werden.

Ich habe ein Stück Code, die kleinen Berichtsdateien generiert. Für jede Datei in der Sammlung wird eine gespeicherte Prozedur, die Daten über XML-Reader (es ist ein ziemlich großes Ergebnismenge) erhalten ausgeführt. Wenn ich das alles geschaffen und trat durch sie, ist alles gut. Dateien erzeugt werden, keine Fehler.

Diese Bibliothek wird über Remoting genannt, und wird über IIS gehostet. Wenn ich die kompilierte Bibliothek bereitstellen und nenne es, seine Lage, einige der Berichte zu generieren, aber dann einen Thread Abort Exception wirft. Wenn ich den Debugger an den asp Worker-Prozess anhängen, und Schritt durch den Code, habe ich keine Probleme.

als dieses Scheitern zu sehen, ist ziemlich konsistent, ich nach Ähnlichkeiten gesucht und gefunden, dass der Fehler auf verschiedene Berichten geschieht, scheint aber bei etwa dem gleichen chronologischen Punkt passieren.

Dies führt mich zu glauben, dass es ein Timeout war Einstellung, dass der Debugger überschrieben wird, habe ich einige raue Timings des Gesamtprozesses hat (nicht die einzigen Stück andernfalls Code) und es scheint nur nach etwa 200 Sekunden zum Scheitern verurteilt. Die web.config executionTimeout ist 600 Minuten (viel hoch genug). Es gibt auch andere Teile dieser Server-Anwendung, die COM + Transaktionen erfordern (2 Minuten Timeout), aber dies ist nicht einer von ihnen. Ich bin ratlos, was Timeout könnte es (bei etwa 200-Sekunden-Marke) schlagen werden.

Das SQL-Verbindungs-Timeout bei Standard verlassen wird (die Verbindung öffnet erfolgreich), ist der Befehl Timeout 300 Sekunden (es dauert nur 12 bis 15 den Befehl exec).

  • Gibt es eine andere Timeout, dass ich fehlen könnte?

Ich lief SQL Profiler, und es zeigt, dass das Ergebnis korrekt zurückgegeben wird (alle Anweisungen und RPC abgeschlossen - keine Fehler). Die Ausführung der Code über SSMS liefert perfekte Ergebnisse.

Mit Reflektor, bohrte ich in die SNINativeMethodWrapper, und es ist ein Wrapper für nicht verwalteten Code und ich kann nicht sehen, was seine zu tun versuchen tatsächlich. Ich kann nur annehmen (vielleicht zu Unrecht), dass der Code der TDS aus dem SQL-Server erhalten hat, und der Wrapper versucht, die Verbindung mit dem Paket verbunden zu bekommen und es nicht kann.

  • Wer weiß, was dieser Wrapper tun soll?
  • Gibt es eine Möglichkeit / debug zu verfolgen diesen Code, um herauszufinden, was den Fehler verursacht?

Ich habe versucht, mit verschiedenen Methoden (ExecScalar, Dataadapter), aber sie alle nutzen ExecuteReader intern.

Ich habe versucht, das Verbindungspooling deaktivieren und zwingt den Client die gleiche Paketgröße als Server zu verwenden.

  • Hat jemand irgendwelche Ideen, was dies verursacht, oder das, was ich tun kann, zu isolieren und versuchen, das Problem zu beheben?

Dies ist der Aufrufcode, wo die Ausnahme erzeugt wird.

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

Stapel

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()...
War es hilfreich?

Lösung

Ich glaube, ich habe das Problem gelöst haben. Die beanstandeten Codezeile in dem obigen Beispiel war die Aussage ...

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

Dies ist ein Aufruf zu einem Application Block (MS Enterprise Library) für die Protokollierung von Ereignissen auf flache Dateien (in diesem Fall) oder Ereignisprotokolle.

Dies, zwischen dem ExecuteXmlReader () und der tatsächlichen Nutzung des Lesers im XML-Dokument, manchmal hart versagt, so dass der ganze Thread abzubrechen. Ich zog die Linie nach dem _xmlReader.Close() und kümmerte sich um das Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top