我正在使用ADO.Net SqlCommand类型,我将CommandTimeout设置为30秒。
我的问题是连接/命令会导致超时,从而导致系统崩溃的未处理异常!
我试图检索的数据对系统至关重要 - 所以我想修复超时而不是添加异常处理重试逻辑。
所以我的问题是;您如何避免/修复数据库超时问题?
我不想将超时设置为大于30秒的值,因为我有时间关键代码。
由于
答案 0 :(得分:4)
必须实施上述两个问题。无论采取什么预防措施,数据库调用总是会抛出异常,因此您必须处理异常,句点。
如果您的通话时间超过30秒,则表示您要么进行大量处理,要么一直处于阻止状态。很可能你一直都被封锁了。要减少阻塞,请减少锁的范围和持续时间。对这样一个通用问题做出更详细的回答意味着基本上重申了交易处理理论的所有原则......
答案 1 :(得分:0)
我的应用程序安装在客户的网络上非常不可靠......我们不得不在连接丢失后重试命令的执行,因为它第二次通过(我们在这里谈论SQL Server 2005)。
假设您正在使用事务处理(如果没有那么你应该),这是我的提交事务包装器,它可以很好地处理丢失的连接(可以优化我猜...但它只是我的代码中的一个复制/粘贴):< / p>
Public Shared Function SafeCommitRollback(ByVal Trans As SqlClient.SqlTransaction, Optional ByVal Action As TROperation = TROperation.Commit, Optional ByVal QuietMode As Boolean = False) As Boolean
SafeCommitRollback = False
Dim TryRollback As Boolean = False
Dim ConnLost As Boolean = False
Dim msgErr As String = ""
If Action = TROperation.Commit Then
Try
Trans.Commit()
SafeCommitRollback = True
Catch ex As SqlClient.SqlException When ex.Class = 20 OrElse (ex.Class = 11 And ex.Number = -2)
ConnLost = True
Catch ex As System.InvalidOperationException When ex.Source = "System.Data" 'AndAlso ex.Message.StartsWith("Timeout expired.")
ConnLost = True
Catch ex As Exception
TryRollback = True
msgErr &= clsErrorHandling.ParseException(ex, True)
End Try
If ConnLost Then
Try
Trans.Commit()
SafeCommitRollback = True
Catch ex2 As Exception
TryRollback = True
msgErr &= clsErrorHandling.ParseException(ex2, True)
End Try
End If
Else
TryRollback = True
End If
If TryRollback Then
Try
Trans.Rollback()
If Action = TROperation.Rollback Then SafeCommitRollback = True
Catch ex3 As Exception
msgErr &= clsErrorHandling.ParseException(ex3)
End Try
End If
If Not QuietMode AndAlso msgErr.Trim <> "" Then clsMessageBox.ShowError(msgErr)
End Function
我希望这会有所帮助......
答案 2 :(得分:0)
同意Remus,如果发生超时则处理超时。
优化数据库查询有很多空间。除非我有详细信息,否则它不具体,但您可以尝试
使用sql配置文件优化查询 使用存储过程,而不是内联代码 优化数据库模式,包括列可能有用的索引。 如果返回很多行,请尝试分页 只返回你需要的东西。如果暂停不是由于阻止,这是一篇很好的文章 -
http://searchsqlserver.techtarget.com/generic/0,295582,sid87_gci1339694,00.html