目前,我的windows服务每天处理大约1500笔交易。大约每周一次,我在使用LINQ完成的Insert上收到一个随机超时异常。
例外情况是:
Exception (SqlException) System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Linq查询是:
dc.TransactionLoggings.InsertOnSubmit(new TransactionLogging()
{
DateAdded = DateTime.UtcNow,
InputMessage = message,
DocId = documentID.ToString(),
TransactionStatus = transactionStatus
});
dc.SubmitChanges();
关于如何诊断这个问题,有什么想法/建议吗??
非常感谢你的帮助,Fiona
更新
表格结构为:
CREATE TABLE [dbo].[TransactionLogging](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[InputMessage] [nvarchar](max) NULL,
[CCHMessage] [nvarchar](max) NULL,
[DocId] [char](20) NOT NULL,
[TransactionStatus] [char](5) NOT NULL,
[DateAdded] [datetime] NULL,
[LastUpdate] [datetime] NULL,
[SentDate] [datetime] NULL,
CONSTRAINT[PK_TransactionLogging]主键集群(ASC)其中(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)在[PRIMARY]上)关于[初级
此外,最近的2个事务超时发生在当天的第一个事务中。我确信这不是巧合!
也只是想知道是否有人对我的代码的以下更新有任何想法:
有什么意见吗?!!!
using (MiddlewareDBDataContext dc = new MiddlewareDBDataContext(ConfigurationWrapper.ActivityLoggingDatabase_ConnectionString))
{
dc.TransactionLoggings.InsertOnSubmit(new TransactionLogging()
{
DateAdded = DateTime.UtcNow,
InputMessage = message,
DocId = documentID.ToString(),
TransactionStatus = transactionStatus
});
try
{
dc.SubmitChanges();
}
catch (SqlException ex)
{
//Wait for 30 seconds then retry..
System.Threading.Thread.Sleep(30000);
dc.SubmitChanges();
}
}
您应该给命令更多的执行时间以防止超时。这可以通过以下方式实现:
using(var db = new DataContext())
{
db.CommandTimeout = 60; // seconds
// your queries ...
}
好吧,SQL Server可能需要可变的时间来执行一个操作。(尤其是INSERT
可能需要比您预期的更多的工作。)超时的概念是有原因的。
所以我认为答案是超时是代码需要处理的现实。您可以增加超时值,这样就可以减少异常发生的频率。但是,您可能应该捕获异常并做一些合理的事情,例如尝试再次插入和/或将错误条件转发给用户。
除非你运气好,否则需要一些工作才能找到。考虑到你每天要做1500次,而你每周都要做一次,我会按照Greg H的建议去做,并在发生时处理它。
默认连接超时为60秒,默认命令超时为15秒。如果是连接故障,我希望看到其他一些操作在同一时间因同样的原因失败。你可以增加命令超时,但在我看来,这将是一个务实的解决方案,但问题的性质表明,如果你增加服务器上的负载,情况会变得更糟,在这种情况下,精简可能会变得愚蠢。
我会研究那些对表有重大作用的函数,尤其是聚合函数。在它们周围放置某种跟踪日志可能有助于缩小范围。考虑到你在五天的手术中有1/7500的失败率,我想知道这是否值得付出努力。万分之一的人在7天内。。。
顺便说一句,这个表上有触发器吗?如果有,它们值得一看。