Voici un exemple de mon code dans un DAL. Tous les appels aux procédures stockées de la base de données sont structurés de cette façon, et il n'y a pas de SQL en ligne.Ai-je des connexions ADO.NET?
Friend Shared Function Save(ByVal s As MyClass) As Boolean
Dim cn As SqlClient.SqlConnection = Dal.Connections.MyAppConnection
Dim cmd As New SqlClient.SqlCommand
Try
cmd.Connection = cn
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "proc_save_my_class"
cmd.Parameters.AddWithValue("@param1", s.Foo)
cmd.Parameters.AddWithValue("@param2", s.Bar)
Return True
Finally
Dal.Utility.CleanupAdoObjects(cmd, cn)
End Try
End Function
est ici l'usine de connexion (si j'utilise le terme correct):
Friend Shared Function MyAppConnection() As SqlClient.SqlConnection
Dim cn As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ToString)
cn.Open()
If cn.State <> ConnectionState.Open Then
' CriticalException is a custom object inheriting from Exception.
Throw New CriticalException("Could not connect to the database.")
Else
Return cn
End If
End Function
est ici la fonction Dal.Utility.CleaupAdoObjects():
Friend Shared Sub CleanupAdoObjects(ByVal cmd As SqlCommand, ByVal cn As SqlConnection)
If cmd IsNot Nothing Then cmd.Dispose()
If cn IsNot Nothing AndAlso cn.State <> ConnectionState.Closed Then cn.Close()
End Sub
Je suis Le délai d'attente écoulé avant la fin de l'opération ou le serveur ne répond pas. messages d'erreur signalés par les utilisateurs. La DAL de l'application ouvre une connexion, lit ou enregistre des données et les ferme. Aucune connexion n'est jamais laissée ouverte - intentionnellement!
Il n'y a rien d'évident sur le serveur Windows 2000 hébergeant SQL Server 2000 qui indiquerait un problème. Rien dans les journaux des événements et rien dans les journaux SQL Server. Les délais d'expiration sont aléatoires. Je ne peux pas les reproduire. Cela arrive tôt dans la journée avec seulement 1 à 5 utilisateurs dans le système. Cela arrive aussi avec environ 50 utilisateurs dans le système. La plupart des connexions à SQL Server via Performance Monitor, pour toutes les bases de données, a été d'environ 74.
Les dépassements de délai se produisent dans un code qui enregistre et lit dans la base de données dans différentes parties de l'application. La trace de pile ne pointe pas vers une ou deux fonctions DAL incriminées. C'est arrivé dans beaucoup d'endroits différents.
Est-ce que mon code ADO.NET semble être capable de fuir les connexions? Je me suis un peu amusé, et j'ai lu que si le pool de connexion se remplissait, cela peut arriver. Cependant, je ne définis pas explicitement de regroupement de connexions. J'ai même essayé d'augmenter le délai d'attente de connexion dans la chaîne de connexion, mais les délais d'attente arrive bien avant les 300 secondes (5 minutes) Valeur:
<add name="MyConnectionString" connectionString="Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=SSPI;Connection Timeout=300;"/>
Je suis à une perte totale déjà à ce qui est l'origine de ces Problèmes de dépassement de délai Toutes les idées sont appréciées.
EDIT: Il s'agit d'une application WinForms.
Existe-t-il un équivalent VB.NET à Using? Je ne pense pas que VB.NET's With ... End With fonctionne comme C# 's Using. EDIT: Peut-être que je devrais lire votre code posté plus près ... VB.NET Using;) – HardCode
Si j'ouvre ma connexion dans ma fonction "usine de connexion", et puis enfermer la variable de connexion locale dans un Using (tout en étant déjà ouvert), J'élimine l'ouverture de la connexion après "Utilisation de la commande". Will "Using connection" ferme-t-il toujours la connexion, même si elle a été ouverte dans la fonction d'usine de connexion? – HardCode
VB.NET a l'instruction Using à partir de la structure 2.0. L'utilisation se traduit simplement par un bloc Try Finally, avec Dispose étant appelé dans le Final. En utilisant Reflector, nous pouvons voir que la méthode Dispose de SqlConnection appelle Close(). Peu importe que l'objet soit créé dans votre classe d'usine. Il sera enveloppé dans un bloc Finally et Close sera appelé. C'est la beauté de l'utilisation. Il s'assure que vos objets appellent Dispose(), ce qui dans ce cas garantit également que votre connexion sera fermée. –