asp.net – 偶尔获取SqlException:超时过期

我的应用程序在我的服务器上运行.这个应用程序的问题是,我每天接近10-20,System.Data.sqlClient.sqlException超时过期.在完成操作或服务器之前经过的超时时间没有仅响应我的一个SP.这是我的SP,
ALTER PROCEDURE [dbo].[Insertorupdatedevicecatalog] 
                            (@OS                NVARCHAR(50),@UniqueID          VARCHAR(500),@Longitude         FLOAT,@Latitude          FLOAT,@Culture           VARCHAR(10),@Other             NVARCHAR(200),@IPAddress         VARCHAR(50),@Nativedeviceid    VARCHAR(50))
            AS 
            BEGIN 

                DECLARE @OldUniqueID VARCHAR(500) = '-1';
                SELECT @OldUniqueID = [UniqueID] FROM DeviceCatalog WHERE (@Nativedeviceid != '' AND [Nativedeviceid] = @Nativedeviceid);

                BEGIN TRANSACTION [Tran1]
                    BEGIN TRY
                        IF EXISTS(SELECT 1 FROM DeviceCatalog WHERE [UniqueID] = @UniqueID) 
                        BEGIN 
                            UPDATE  DeviceCatalog 
                               SET  [OS] = @OS,[Location] = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(100 ),@Longitude) + ' ' + CONVERT(VARCHAR(100),@Latitude) + ')',4326),[Culture] = @Culture,[Other] = @Other,[Lastmodifieddate] = Getdate(),[IPAddress] = @IPAddress
                            WHERE   [UniqueID] = @UniqueID;
                        END
                        ELSE 
                        BEGIN
                            INSERT INTO DeviceCatalog
                                        ([OS],[UniqueID],[Location],[Culture],[Other],[IPAddress],[Nativedeviceid])
                                VALUES  (@OS,@UniqueID,geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(100),@Culture,@Other,@IPAddress,@Nativedeviceid);
                                IF(@OldUniqueID != '-1' AND @OldUniqueID != @UniqueID)
                                BEGIN
                                    EXEC DeleteOldDevice @OldUniqueID,@UniqueID;
                                END
                        END
                        COMMIT TRANSACTION [Tran1];
                    END TRY
                    BEGIN CATCH
                        ROLLBACK TRANSACTION [Tran1];
                        DECLARE @ErrorNumber nchar(5),@ErrorMessage nvarchar(2048);
                        SELECT
                            @ErrorNumber = RIGHT('00000' + ERROR_NUMBER(),5),@ErrorMessage = @ErrorNumber + ' ' + ERROR_MESSAGE();
                        RAISERROR (@ErrorMessage,16,1);
                    END CATCH
            END

这个SP有什么问题吗?为什么我在这个SP中得到超时异常?这是Stack Trace,

System.Data.sqlClient.sqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   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 App.Classes.DBLayer.Execute(sqlCommand command,Boolean executeNonQuery)
   at App.Helpers.sqlHelper.GetResult(List`1 parameters,Boolean storedProcedure,String commandText,ResultType type)
   at App.Helpers.sqlHelper.ExecuteNonQuery(List`1 parameters,String commandText)
   at App.Services.DeviceCatalogService.InsertOrUpdateDeviceCatalog(DeviceCatalog deviceCataLog)
   at WebApplication1.Handlers.RegisterDevice.ProcessRequest(HttpContext context)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)

解决方法

您需要在服务器端进行调查,以了解为什么执行超时.请注意,服务器没有超时,超时是由 SqlCommand.CommandTimeout认30秒引起的.

一个很好的资源是Waits and Queues,它是一种诊断sql Server性能瓶颈的方法.根据超时的实际原因,可以采取适当的措施.您必须首先确定您是否处理缓慢的执行(坏计划)或阻止.

如果我冒昧猜测,我会说IF IFISIS UPDATE的不正常模式是根本原因.此模式不正确并将导致并发故障.同时执行IF EXISTS的两个并发事务将同时得出相同的结论,并尝试进行INSERT或UPDATE.根据数据库中的现有限制,您可能会遇到死锁(幸运案例)或丢失的写入(不幸的情况).但是,只有适当的调查才能揭示实际的根本原因.可能是一个完全不同的东西,比如auto-growth events.

您的程序也错误地处理CATCH块.您必须始终检查XACT_STATE(),因为您的CATCH块运行时可能已经回滚事务.也不清楚您对命名事务的期望,这是我常常遇到的常见错误,常常与命名事务与保存点混淆.对于正确的模式,请参阅Exception Handling and Nested Transactions.

编辑

这是一种可能的方式来调查这一点:

>将相关CommandTimeout更改为0(即无限大).
>启用blocked process threshold,设置为30秒(前一个CommandTimeout)
>在Profiler中监视Blocked Process Report Event
>开始你的工作量
>查看Profiler是否生成任何报告事件.如果这样做,他们会确定原因.

如果超时是由于阻塞引起的,那么每次收到超时时,这些操作将导致“阻止进程报告”事件.您的应用程序将继续等待,直到阻止被移除,如果阻塞是由live-lock造成的,那么它将永远等待.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: ' Style="position: relative" AppendDataBoundItems="True"> (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke '*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the "Report Items" section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating