我正在调查我们网站使用 SQL Server 管理会话的问题。该网站是基于 sitecore CMS 的 asp.net 网络表单。我们在各种环境中都有相同的代码,例如 QA、登台和生产。
在生产中,我们看到的是,周期性地,我们得到一个快速上升的 CPU 使用率,这与服务器的流量没有任何关系。除了这个 cpu 峰值,我们还看到了网络 I/O 的相应峰值。
我们的监控软件不会区分到 Internet 的流量和到 DB 服务器的流量;但是,我们在 DB 服务器上看到的实际上是每秒dbo.TempGetStateItemExclusive3
对 asp 会话数据库的数百次调用,所有这些调用都是针对相同的会话 id,并且没有相应数量的页面请求进入 Web 服务器。
使用相同的代码和配置,我们根本看不到其他环境的这种行为。对于其他会话 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?