2009-06-16 9 views
3

J'utilise le type SqlCommand ADO.Net et je mets le CommandTimeout à 30 secondes.Délai d'attente de connexion aléatoire SQL 2005/meilleure pratique concernant les délais d'attente db

Mon problème est que la connexion/commande empêche le dépassement de temps provoquant des exceptions non gérées qui font planter mon système!

Les données que j'essaie de récupérer sont critiques pour le système. Je souhaite donc corriger les délais d'attente plutôt que d'ajouter une logique de nouvelle tentative de gestion des exceptions.

Donc, ma question est; Comment évitez-vous/corrigez-vous les problèmes de délai d'attente de base de données?

Je ne veux pas définir le délai d'expiration sur une valeur supérieure à 30 secondes car j'ai le code critique de temps.

Merci

Répondre

4
  1. exception de la poignée de sorte qu'ils ne plantent pas votre système
  2. réparer votre base de données appelle donc ils ne temps pas

Les deux questions ci-dessus doivent être mises en œuvre. Un appel de base de données peut toujours lever des exceptions, quelles que soient les précautions que vous prenez, vous devez donc gérer l'exception, point.

Si vos appels durent plus de 30 secondes, cela signifie que vous effectuez BEAUCOUP de traitement ou que vous êtes bloqué en permanence. Très probablement vous êtes bloqué tout le temps. Pour réduire le blocage, réduisez la portée et la durée de vos verrous. Donner une réponse plus détaillée pour une telle question générique signifierait fondamentalement réitérer à travers tous les principes de la théorie de traitement de transaction ...

+0

Bonne réponse, de meilleures requêtes et les index sur les tables peuvent vous aider. –

+0

Vous ne pouvez jamais être sûr que les délais ne se produisent pas, parfois ces choses se produisent même avec le meilleur code. Toujours gérer les exceptions! – AllenG

0

Mon application a été installée sur un réseau de client qui était TRÈS peu fiable ... nous avons dû réessayer un l'exécution de la commande après une connexion perdue parce que la deuxième fois elle est généralement passée (nous parlons ici de SQL Server 2005). Assumant que vous utilisez des transactions (si ce n'est pas le cas), voici mon encapsuleur Commit Transaction qui gère assez bien les connexions perdues (peut être optimisé je suppose ... mais c'est juste un copier/coller de mon code):

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 

J'espère que cette aide ...

+0

Vous pouvez le convertir en C# en utilisant cet outil: http://www.developerfusion.com/tools/convert/vb-to-csharp/ –

0

Remus d'accord avec, gérer le délai d'attente si elle se produit.

Il y a beaucoup de possibilités d'optimisation de la requête de base de données. Ce n'est pas spécifique à moins d'avoir les détails, mais vous pouvez essayer

Utiliser le profil pour optimiser les requêtes SQL utiliser des procédures stockées, pas de code en ligne schéma de base de données, Optimize comprennent l'indice sur l'endroit où la colonne pourrait aider. Essayez la recherche de personne si vous renvoyez un grand nombre de lignes Renvoyez uniquement ce dont vous avez besoin. Si le délai d'attente est pas due au blocage est ici un excellent article -

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

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

Questions connexes