目前,我的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();
关于如何诊断这个问题的任何想法/建议?
非常感谢你的帮助, 菲奥娜
更新
表结构是:
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] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )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();
}
}
答案 0 :(得分:2)
您应该给予更多时间执行命令以防止超时。这可以通过以下方式完成:
using(var db = new DataContext())
{
db.CommandTimeout = 60; // seconds
// your queries ...
}
答案 1 :(得分:0)
好吧,SQL Server可能需要不同的时间来执行操作。 (特别是INSERT
可能需要比预期更多的工作。)超时的概念是有原因的。
所以我认为答案是超时是您的代码需要处理的现实。您可以增加超时值,这样可以减少异常的频率。但是,您应该捕获异常并做一些合理的事情,例如尝试再次插入和/或将错误条件转发给用户。
答案 2 :(得分:0)
除非你很幸运,否则需要做一些工作来追查。鉴于你每天做1500次并且你每周都会得到其中一个,我会选择Greg H所建议的并在碰巧时处理它。
默认连接超时为60秒,默认命令超时为15秒。如果是连接失败,我希望看到其他一些操作在同一时间出于同样的原因而失败。你可以增加命令超时,但在我看来这是一个症状修复,一个实用的解决方案,但问题的本质表明,如果你增加服务器的负载,它会变得更糟,在这种情况下,thinng可能会变得愚蠢
我正在研究那些与表格有关的功能,尤其是聚合功能。在它们周围放置某种跟踪日志可能会帮助您缩小范围。鉴于你在五天的运作中有7500的失败率,Definitley想知道这是否值得付出努力。 7天内每10,000人中有1人......
顺便说一下,这张桌子上是否有任何触发器,如果是这样,他们将值得一看。