L’utilisation de MySQLConnection en C # ne se ferme pas correctement

Solution finale:

La connexion a été ajoutée au pool de connexion. Alors je l’ai fermé, mais il est toujours resté physiquement ouvert. Avec le paramètre ConnectionSsortingng “Pooling = false” ou les méthodes statiques MySqlConnection.ClearPool (connexion) et MySqlConnection.ClearAllPools, le problème peut être évité. Notez que le problème était que la connexion était toujours active lorsque j’ai fermé l’application. Même si je l’ai fermé. Donc, je n’utilise pas du tout le pool de connexions ou je nettoie le pool spécifique avant de fermer la connexion et le problème est résolu. Je prendrai mon temps pour déterminer quelle est la meilleure solution dans mon cas.

Merci à tous ceux qui ont répondu! Cela m’a aidé à mieux comprendre les concepts de C # et j’ai beaucoup appris grâce aux informations utiles. 🙂

===

Problème d’origine:

Je cherche depuis un moment et je n’ai pas trouvé la solution à mon problème: je suis nouveau en C # et j’essaie d’écrire un cours pour faciliter les connexions MySql. Mon problème est, après que j’ouvre une connexion et la ferme. Il est toujours ouvert dans la firebase database et est abandonné.

J’utilise l’instruction ‘using’ ‘bien sûr, mais la connexion est toujours ouverte et est interrompue après la sortie du programme.

Voici à quoi ressemble mon code:

using (DatabaseManager db = new DatabaseManager()) { using (MySqlDataReader result = db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC")) { foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC")) { //Do stuff here } } } 

La classe Database manager ouvre la connexion et la ferme une fois supprimée:

 public DatabaseManager() { this.connectionSsortingng = new MySqlConnectionSsortingngBuilder("Server=localhost;Database=businessplan;Uid=root;"); connect(); } private bool connect() { bool returnValue = true; connection = new MySqlConnection(connectionSsortingng.GetConnectionSsortingng(false)); connection.Open(); } public void Dispose() { Dispose(true); } public void Dispose(bool disposing) { if (disposing) { if (connection.State == System.Data.ConnectionState.Open) { connection.Close(); connection.Dispose(); } } //GC.SuppressFinalize(this);//Updated } //Updated //~DatabaseManager() //{ // Dispose(false); //} 

Donc, j’ai vérifié dans le débogueur et la méthode Dispose () – est appelée et s’exécute correctement. Qu’est-ce que je rate? Y a-t-il quelque chose que j’ai fait de travers ou que j’ai mal compris?

Toute aide est appréciée!

Salutations, Simon

PS: Juste au cas où, la méthode DataReader () (Version mise à jour):

 public IEnumerable DataReader(Ssortingng query) { using (MySqlCommand com = new MySqlCommand()) { com.Connection = connection; com.CommandText = query; using (MySqlDataReader result = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection)) { while (result.Read()) { yield return (IDataReader)result; } } } } 

Ok, j’ai essayé d’utiliser le rendement:

 foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC")) { //... } 

Et j’ai changé la méthode DataReader:

 public IEnumerable DataReader(Ssortingng query) { using (MySqlCommand com = new MySqlCommand()) { com.Connection = connection; com.CommandText = query; using (MySqlDataReader result = com.ExecuteReader()) { while (result.Read()) { yield return (IDataReader)result; } } } } 

Cela fonctionne de la manière dont je peux récupérer les données, mais j’ai toujours le même problème: la connexion n’est pas fermée correctement. 🙁

Je ne suis pas sûr de la connexion mysql, mais la partie compteur du serveur SQL utilise le regroupement de connexions et ne se ferme pas lorsque vous appelez close, mais le place dans le pool de connexions!

Edition: assurez-vous de disposer des objects Reader, Command et Connection!

Edition: résolu avec le paramètre ConnectionSsortingng “Pooling = false” ou les méthodes statiques MySqlConnection.ClearPool (connexion) et MySqlConnection.ClearAllPools ()

Vous devez également insérer la commande et le DataReader dans using instructions.

Selon la documentation mysql, MySQLConnection n’est pas fermée lorsqu’elle sort de la scope. Par conséquent, vous ne devez pas l’utiliser à l’intérieur d’un utilisateur.

Quote … “Si la connexion MySqlConnection est hors de scope, elle n’est pas fermée. Par conséquent, vous devez explicitement fermer la connexion en appelant MySqlConnection.Close ou MySqlConnection.Dispose.”

Regardez quelque chose comme ceci:

 private static IEnumerable SqlResortingeve( ssortingng ConnectionSsortingng, ssortingng StoredProcName, Action AddParameters) { using (var cn = new SqlConnection(ConnectionSsortingng)) using (var cmd = new SqlCommand(StoredProcName, cn)) { cn.Open(); cmd.CommandType = CommandType.StoredProcedure; if (AddParameters != null) { AddParameters(cmd); } using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { while (rdr.Read()) yield return rdr; } } }