SQL サーバーを使用してセッションを管理する Web サイトの問題を調査しています。この Web サイトは、sitecore CMS に基づく asp.net Web フォームです。QA、ステージング、本番など、さまざまな環境で同じコードを使用しています。
本番環境では、サーバーへのトラフィックとはまったく関係のない CPU 使用率が定期的に急速に上昇しています。この CPU スパイクに伴い、ネットワーク I/O に対応するスパイクが見られます。
当社の監視ソフトウェアは、インターネットへのトラフィックと DB サーバーへのトラフィックを区別しません。ただし、DB サーバーで見られるのは、文字通り 1 秒あたり数百回の呼び出しdbo.TempGetStateItemExclusive3
が asp セッション データベースにあり、すべて同じセッション ID に対して行われ、対応する量のページ リクエストが Web サーバーに着信することはありません。
同じコードと構成では、他の環境ではこの動作は見られません。また、他のセッション ID では表示されず、この 1 つの特定の ID だけです。
データベースから行を削除しても、同じセッション ID で再作成されるだけです。
アップデート
イベント ログに次のエラーが見つかりました。
Violation of PRIMARY KEY constraint 'PK__ASPState__C9F49290145C0A3F'. Cannot insert duplicate key in object 'dbo.ASPStateTempSessions'. The duplicate key value is (sessionidwiththeproblem). The statement has been terminated.
Stack trace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean\ breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand\ cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,\ TdsParserStateObject stateObj)
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.InternalExecuteNonQuery(DbAsyncResult\ result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Web.SessionState.SqlSessionStateStore.SqlExecuteNonQueryWithRetry(SqlCommand\ cmd, Boolean ignoreInsertPKException, String id)
重複したセッション ID を作成しようとする方法を知っている人はいますか?