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块.您必须始终检查 编辑 这是一种可能的方式来调查这一点: >将相关 如果超时是由于阻塞引起的,那么每次收到超时时,这些操作将导致“阻止进程报告”事件.您的应用程序将继续等待,直到阻止被移除,如果阻塞是由live-lock造成的,那么它将永远等待. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在运行时ASP.NET捆绑和缩小有什么好处?
- 来自ASP.NET MVC站点的“无效的JSON原语:alihack”错误
- asp.net – 当我按浏览器BACK按钮会发生什么?
- dependency-injection – 如何使用unity注入ApplicationUse
- asp.net-mvc – MVC WebApi不使用AutofacWebApiDependencyR
- entity-framework – 术语’scaffold-dbcontext’不被识别为
- asp.net-mvc – 在ASP .NET MVC 3中使用XSLT
- asp.net-mvc – 如何将整数列表传递给MVC操作?
- ASP.NET /数据库性能清单
- 验证 – 在编辑页面上保存时忽略必需属性
- asp.net-mvc – ASP MVC友好的URL和相对路径图像
- ASP.NET HttpApplication生命周期
- ASP.NET MVC 2加载部分视图使用jQuery – 没有客
- ASP.NET MVC 3数据注释大于下载日期时间和int
- Asp.Net MVC3到MVC4升级工具?
- asp.net – 在新的VS 2013 Identity UserManager
- asp.net-mvc – ASP.net MVC 4 WebApi中的嵌套资
- asp.net – 如何在一个新的选项卡中打开asp:Hyp
- 将ASP.NET MVC4应用程序部署到GoDaddy编译器问题
- 捕获从ASP.NET生成的HTML
