我有一些好奇的行为,我无法弄清楚为什么会发生。我看到间歇性的超时异常。我很确定它与音量有关,因为它在我们的开发环境中不可重复。作为一个bandaid解决方案,我尝试将sql命令超时提升到60秒,但正如我发现的那样,这似乎没有帮助。这是一个奇怪的部分,当我检查我的登录过程失败时,这里是开始和结束时间:
那么当我将命令超时设置为60时,怎么可能在30秒内超时?
仅供参考,以下是抛出的异常:
System.Data.SqlClient.SqlException: 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(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
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.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at SetClear.DataAccess.SqlHelper.ExecuteReader(CommandType commandType, String commandText, SqlParameter[] commandArgs)
答案 0 :(得分:3)
这可能听起来很愚蠢,但只是听我说。检查查询中涉及的所有索引和主键。它们存在吗?它们是否支离破碎?我有一个问题,所以有一些原因,直接运行脚本工作只是找到,但是当我通过应用程序执行它时,它很慢,因为污垢。读者基本上就像游标一样,因此索引非常重要。
可能不是这个,但它始终是我检查的第一件事。
答案 1 :(得分:3)
SQL命令超时,因为您使用的查询所花费的时间比执行时要长。在查询分析器或Management Studio中执行它,在数据库中使用代表性的数据量,并查看执行计划以找出什么是缓慢的。
如果某些事情花费了大部分时间并被描述为“表扫描”或“聚簇索引扫描”,请查看是否可以创建将该操作转换为键查找的索引(索引搜索或聚集索引寻求)。
答案 2 :(得分:0)
尝试更改SqlConnection的超时属性,而不是命令
答案 3 :(得分:0)
因为连接发生了超时,而不是命令。您需要设置connection.TimeOut属性
答案 4 :(得分:0)
我曾经遇到过这个问题,我在一个数据库视图中跟踪了一些非常低效的SQL代码。有人将带有子查询的复杂条件放入表连接的ON子句中,而不是放入它所属的WHERE子句中。一旦我纠正了这个错误,问题就消失了。