2009-06-16 6 views
3

ADO.Net SqlCommandタイプを使用していますが、CommandTimeoutを30秒に設定しています。dbタイムアウトに関するSQL 2005ランダム接続タイムアウト/ベストプラクティス

私の問題は、接続/コマンドがシステムをクラッシュさせる未処理の例外を引き起こしてタイムアウトしてしまうことです。

私が取り出そうとしているデータはシステムにとって非常に重要です。したがって、例外処理のリトライロジックを追加するのではなく、タイムアウトを修正したいと思います。

私の質問です。どのようにしてデータベースタイムアウトの問題を回避/修正しますか?

タイムクリティカルなコードがあるため、タイムアウトを30秒を超える値に設定したくありません。

おかげ

答えて

4
  1. ハンドル例外彼らはあなたのシステムがクラッシュしないよう
  2. は、データベースを修正する上記の問題の両方が実施されなければならないので、彼らは

をタイムアウトしません呼び出します。データベースの呼び出しは、何の注意を払っても例外をスローすることができるため、例外の期間を処理する必要があります。

コールが30秒以上かかる場合は、処理が多いこと、または常にブロックされていることを意味します。ほとんどの場合、常にブロックされている可能性があります。ブロックを減らすには、ロックの範囲と期間を減らします。このような一般的な質問に対してより詳細な応答を与えることは、基本的にトランザクション処理理論のすべての原則を繰り返し示すことを意味します。

+0

良い答えを、テーブル上の優れたクエリやインデックスはあなたを助けるかもしれません。 –

+0

タイムアウトが発生しないことを決して確認することはできません。時にはこれらのことが最良のコードでも発生することがあります。常に例外を処理してください! – AllenG

0

私のアプリは非常に信頼性の低い顧客のネットワークにインストールされました... 2回目の通常通りの処理のため、接続が失われた後にコマンドが実行されます(ここではSQL Server 2005について説明しています)。

あなたがトランザクションを使用していると仮定して、そうしなければならない場合は、ここで私のコードからコピー/ペーストするだけで、紛失した接続をかなりうまく処理するコミットトランザクションラッパーがあります。私はこれが役に立てば幸い

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 

...

+0

このツールを使用してC#に変換できます。http://www.developerfusion.com/tools/convert/vb-to-csharp/ –

0

は、それが発生した場合、タイムアウトを処理し、レムスに同意します。

データベースクエリを最適化するための範囲が非常にあります。私は詳細を持っていない限り、それは、特定のではないのですが、あなたは、クエリ 使用ストアドプロシージャではなく、インラインコード 最適化データベーススキーマを最適化するために

使用するSQLプロファイルを試すことができ、カラムは役立つかもしれないどこにインデックスが含まれています。 多くの行を返す場合は、ページングを試してください。 必要なものだけを返します。タイムアウトがここに優れた記事の閉塞が原因ではない場合 -

http://searchsqlserver.techtarget.com/generic/0,295582,sid87_gci1339694,00.html

http://vyaskn.tripod.com/sql_odbc_timeout_expired.htm

関連する問題