SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr packet)”でSqlClient呼び出しが“スレッドを中断していました

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

質問

この問題を切り分けて解決するのに役立つ、どんなに単純で複雑な提案でも本当に感謝します。

小さなレポートファイルを生成するコードが少しあります。コレクション内の各ファイルに対して、ストアドプロシージャが実行され、XMLリーダーを介してデータを取得します(非常に大きな結果セット)。これをすべて作成し、ステップスルーすると、すべてが順調です。ファイルが生成されますが、エラーはありません。

このライブラリはリモーティング経由で呼び出され、IIS経由でホストされます。コンパイルされたライブラリを展開して呼び出すと、レポートの一部を生成できますが、スレッドアボート例外がスローされます。デバッガをASPワーカープロセスにアタッチし、コードをステップ実行しても問題ありません。

この失敗はかなり一貫しているので、類似点を探して、さまざまなレポートで失敗が発生することを発見しましたが、ほぼ同じ年代で発生するようです。

これは、デバッガーがオーバーライドするタイムアウト設定であると考えるようになり、プロセス全体のいくつかの大まかなタイミングを実行し(失敗した単一のコードではなく)、約200秒後に失敗するようです。 web.config executionTimeoutは600分に設定されています(十分に長い)。このサーバーアプリケーションには、COM +トランザクション(2分のタイムアウト)を必要とする他の部分がありますが、これはそのうちの1つではありません。タイムアウトが発生する可能性があります(約200秒のマークで)。

SQL接続のタイムアウトはデフォルトのままです(接続が正常に開きます)。コマンドのタイムアウトは300秒です(コマンドの実行に12〜15だけかかります)。

  • 欠落している可能性のある他のタイムアウトはありますか?

SQLプロファイラーを実行しましたが、結果が正しく返されることが示されています(すべてのステートメントとRPCが完了しました-エラーなし)。 SSMSを介してコードを実行すると、完璧な結果が得られます。

リフレクターを使用して、SNINativeMethodWrapperとそのアンマネージコードのラッパーにドリルインしましたが、実際に何をしようとしているのかわかりません。コードがSQLサーバーからTDSを受信し、ラッパーがパケットに関連付けられた接続を取得しようとしており、それができないと仮定することしかできません(おそらく間違っています)。

  • このラッパーが何をすべきかを知っている人はいますか?
  • このコードをトレース/デバッグして、エラーの原因を特定する方法はありますか?

さまざまなメソッド(ExecScalar、DataAdapter)を使用してみましたが、それらはすべて内部でExecuteReaderを使用しています。

接続プーリングを無効にし、クライアントがサーバーと同じパケットサイズを使用するように強制しました。

  • これを引き起こす原因、または問題を切り分けて修正しようとするために私ができることについて、誰にもアイデアがありますか?

これは、例外が生成される呼び出しコードです。

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

スタック

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()...
役に立ちましたか?

解決

私は問題を解決したと思います。上記の例の問題のあるコード行はステートメントでした...

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

これは、イベントをフラットファイル(この場合)またはイベントログに記録するためのアプリケーションブロック(MSエンタープライズライブラリ)への呼び出しです。

ExecuteXMLReader()とXMLドキュメント内のリーダーの実際の使用の間にあるこの1つは、ときどき激しく失敗し、スレッド全体が異常終了しました。行を _xmlReader.Close()の後に移動し、問題を処理しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top