asp.net – dbo.TempGetStateItemExclusive3重复调用

前端之家收集整理的这篇文章主要介绍了asp.net – dbo.TempGetStateItemExclusive3重复调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在调查一个使用sql Server来管理会话的网站的问题.该网站是基于sitecore CMS的asp.net webforms.我们在各种环境中具有相同的代码,例如质量保证,分期和生产.

在生产中,我们正在看到的是,定期地,我们可以快速上升cpu使用率,并不会以任何方式与服务器通信.随着这个cpu的尖峰,我们看到了网络I / O的相应的尖峰.

我们的监控软件不区分流量到互联网和流量到DB服务器;然而,我们在数据库服务器上看到的数据是asp数据库中每秒数百次调用dbo.TempGetStateItemExclusive3,所有这些都是相同的会话ID,没有相应的页面请求数量进入Web服务器.

使用相同的代码和配置,我们根本看不到其他环境的这种行为.我们也看不到其他会话ID,只是这一个具体的一个.

数据库删除行简单地导致它被重新创建为具有相同的会话ID.

UPDATE

我在事件日志中发现了这个错误

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,Boolean returnStream,Boolean async)
at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,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?

解决方法

我们遇到类似的问题,具有以下配置:

> IIS 7.5
> .NET Framework 4.0
> Windows 2008(在IIS和DB服务器上)
>由ASPState数据库管理的会话

问题是有时一些会话仍被锁定到ASPState数据库中,每秒锁定会话的dbo.TempGetStateItemExclusive3每秒钟会产生数百个调用.

IIS服务器上的cpu最终会随着锁定会话的次数而上升.临时解决方案是回收应用程序池.

进一步并启用IIS服务器上的跟踪,然后分析跟踪,我们注意到,只要EXECUTE_REQUEST_HANDLER模块出现问题(即导致500内部服务器错误的网络连接问题),则下一个模块为RELEASE_REQUEST_STATE (并且应该解锁会话)未被执行.因此,会议保持锁定.

它发现是IIS的一个错误,我们通过在web.config中将uploadReadAheadSize的值更改为0来修复它:

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>

UploadReadAheadSize属性建立Web服务器将读入缓冲区并传递给ISAPI扩展的字节数.每发生一次客户端请求.

也可以看看:
ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress

猜你在找的asp.Net相关文章