Son çözüm:
Bağlantı, bağlantı havuzuna eklenmiştir. Ben de kapattım ama yine de fiziksel olarak açık kaldı. ConnectionString Parametresi ile "Pooling = false" veya MySqlConnection.ClearPool (bağlantı) ve MySqlConnection.ClearAllPools statik yöntemleri ile sorun önlenebilir. Sorunun, uygulamayı kapattığımda bağlantının hala canlı olduğunu unutmayın. Onu kapatmamıza rağmen. Bu yüzden ya hiç havuz kurmayı kullanmıyorum ya da bağlantıyı kapatmadan önce özel havuzu temizliyorum ve problem çözüldü. Vakamda en iyi çözümün ne olduğunu bulmak için zamanımı alacağım.C# içindeki MySQLConnection kullanımı düzgün kapanmıyor
Yanıtlayan herkese teşekkürler! C# kavramlarını daha iyi anlamama yardımcı oldu ve yararlı girdiden çok şey öğrendim. :)
===
Orjinal Sorun:
Bir süredir aramalara ve benim sorununa çözüm bulamadık: C# için yeni ve yazmayı deneyin MySql Bağlantılarını daha kolay hale getirmek için bir sınıf. Sorunum, bir bağlantı açıp kapattıktan sonra. Veritabanında hala açık ve iptal edildi.
'using' ifadesini kullanıyorum 'tabiki, ancak bağlantı hala açık ve programdan çıktıktan sonra iptal ediliyor.
İşte benim kod gibi görünüyor:
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
}
}
}
sınıf Veritabanı yöneticisi bağlantısı açar ve bertaraf zaman kapatır:
public DatabaseManager()
{
this.connectionString = new MySqlConnectionStringBuilder("Server=localhost;Database=businessplan;Uid=root;");
connect();
}
private bool connect()
{
bool returnValue = true;
connection = new MySqlConnection(connectionString.GetConnectionString(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);
//}
Yani, debugger ve Dispose bunu kontrol () -method çağrılır ve doğru şekilde yürütülür. Neyi eksik? Yanlış yaptığım ya da yanlış anladığım bir şey mi var?
Herhangi bir yardım için teşekkür ederiz!
Selamlar, Simon
PS: Her ihtimale DataReader() - yöntem (Güncelleme sürümü):
public IEnumerable<IDataReader> DataReader(String 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;
}
}
}
}
Tamam, verim dönüşü kullanmaya çalıştı:
DataReader yöntemini değiştirdim:
public IEnumerable<IDataReader> DataReader(String query)
{
using (MySqlCommand com = new MySqlCommand())
{
com.Connection = connection;
com.CommandText = query;
using (MySqlDataReader result = com.ExecuteReader())
{
while (result.Read())
{
yield return (IDataReader)result;
}
}
}
}
Verileri alabildiğim şekilde çalışır, ancak yine de aynı sorunla karşılaşıyorum: Bağlantı düzgün şekilde kapatılmadı. :(
Yönetilmeyen kaynaklarınız olmadığından, bir sonlandırıcıya ihtiyacınız yoktur. – SLaks
Bu doğru. Ama şu an canım yanmıyor, değil mi? Yanılıyorsam beni düzeltin. Ana amaç, kullanılmayan bağlantıları artık gerekli olmadıkça kapatmaktır. Bu örüntü, bu hedefe ulaşmanın kolay bir yolu gibi görünüyordu. Web'deki birçok örnekte gösterildiği gibi uyguladım. Sonunda gereksiz koddan kurtulmak için değiştireceğim. – Skalli
Bu bir performans isabeti, ancak aksi halde, hayır. – SLaks