- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的服务器上正在运行应用程序。这个应用程序的问题是,每天我都会遇到近 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) ,@Longitude) + ' ' + CONVERT(VARCHAR(100), @Latitude) + ')', 4326)
,@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 中遇到超时异常?这是堆栈跟踪,
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, 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 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, Boolean storedProcedure, 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 EXISTS... UPDATE
的不健康模式是根本原因。这种模式是不正确的,会导致并发下的失败。两个并发事务执行 IF EXISTS
同时都会得出相同的结论,并且都尝试 INSERT
或UPDATE
。根据数据库中现有的约束,您可能会遇到死锁(幸运的情况)或丢失写入(不幸的情况)。然而,只有适当的调查才能揭示真正的根本原因。可能是完全不同的东西,比如 auto-growth events .
您的过程也错误地处理了 CATCH block 。您必须始终检查 XACT_STATE()
因为在 CATCH block 运行时事务可能已经回滚。也不清楚您对命名事务的期望,这是我看到的一个常见错误,通常与混淆命名事务和保存点有关。对于正确的模式,请参阅 Exception Handling and Nested Transactions .
编辑
以下是调查此问题的可能方法:
CommandTimeout
到 0(即无限)。blocked process threshold
,设置为30秒(之前的CommandTimeout)如果超时是由阻塞引起的,则每次超时时,这些操作都会导致“阻塞进程报告”事件。如果阻塞是由 live-lock 引起的,您的应用程序将继续等待,直到阻塞被移除。然后它将永远等待。
关于asp.net - 偶尔出现SqlException : Timeout expired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917107/
我正在使用 JDBC,并且正在运行一个查询。有没有办法从返回的 SQLException 对象中获取失败的原因? 特别是,我想知道我的查询是否违反了外键约束(以及哪一个)或键约束。 此结果是否特定于供
我用 C# 编写了一段代码,它在我的计算机上运行良好,在 Windows 7 (MS SQL Server 2008) 上运行,但在另一台计算机上运行 Windows Vista (MS SQL Se
我有一个 Web 服务代码,它连接到在 MySQL 上运行的数据库。我清理并构建了它,部署成功,但是当我测试时出现以下错误: Invoking wsimport with http://localho
这个问题已经有答案了: Getting java.sql.SQLException: Operation not allowed after ResultSet closed (2 个回答) 已关闭
我的 user 表以前有字符串主键,现在我添加了一个新字段 userid bigint(20) 并制作了这个主键。然后添加 ALTER TABLE smsusers AUTO_INCREMENT =
我正在尝试在 HSQLDB 数据库中插入新行。我有这个代码: private final String SQL_CREAR_ATLETA=" INSERT INTO ATLETA (ID_ATLETA
错误的屏幕截图我收到指向ItemsService中下面的‘GetAllItems()’方法的SQLException。“无效的列名OrderID1”。我有两个实体,Order和Item,我希望与每个I
错误的屏幕截图我收到指向ItemsService中下面的‘GetAllItems()’方法的SQLException。“无效的列名OrderID1”。我有两个实体,Order和Item,我希望与每个I
Screenshot of errorI am getting an SQLException pointing at the 'GetAllItems()' method below in t
我正在运行我的代码并收到此错误。但这是什么意思? The network path was not found Description: An unhandled exception occurred
对于确实具有平衡事务块的存储过程,您是否遇到过这种异常? 我仔细检查了存储过程,它正好有一个 TRANSACTION BEGIN和对应TRANSACTION END 错误记录 SqlException
我正在编写一个 MVC 5 互联网应用程序,我有一个每小时执行一次的重复任务。此任务使用 DbContext 类更新一些模型对象。该应用程序部署为 Azure 网站。 我每隔几个小时就会收到以下错误:
我有一个程序,可以将大约 1GB 的数据上传到 SQL Azure 数据库。我使用 SqlBulkCopy 上传此数据。我上传了约8,000,000个实体,平均一次上传32,000个实体,最多一次上传
我将我的 SQL Server 数据库从本地移植到生产环境,并在连接期间突然遇到以下错误 System.Data.SqlClient.SqlException: A connection was su
在询问之前我已经搜索过了,但我不知道我是否做错了什么。 我正在尝试做类似的事情: String query = "select nombre from DatosPersonas where nomb
当我尝试运行我的项目时,出现以下错误: java.sql.SQLException: Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNU
我正在将 DB2 与 JDBC 结合使用,当我在连接闲置几分钟后首次尝试运行时,下面的代码会抛出 SQLException。从第二次开始,它将完全按照它必须的方式工作。 ResultSet.next(
我试图插入用户从我在 NetBeans 上制作的 Java GUI 输入的信息,但我不断收到异常,我似乎无法找出我做错了什么。 (数据库名称是student,表也称为student(我知道不好)它有8
为什么我们在创建 jdbc 连接时必须抛出 SQLException,它的目的是什么?它是什么类型的异常?选中、运行时、未选中? 最佳答案 SQLException 派生自 Exception,但不是
我有一个现有的应用程序,它使用 MS SQL 存储过程来执行一些业务规则。当检测到错误时,使用 RAISERROR 将其作为异常返回到我的 .Net 应用程序。 然后 .Net 应用程序可以使用 Tr
我是一名优秀的程序员,十分优秀!