最近、接続プーリングについて読みました ( msdn、mysql のドキュメント)。
接続プールの目的は、MySQL クライアントが常に接続と切断を強制されないようにすることです。したがって、接続のユーザーが接続を必要としなくなったときに、接続を MySQL クライアントにキャッシュすることができます。したがって、同じ MySQL サーバーへの接続を必要とする別のユーザーは、後でこのキャッシュされた接続を再利用できます (Mikael Ronstrom による)。
これが意味することは次のとおりです。
- MySQLサーバーに接続します
- いくつかのクエリを実行する
- MySqlConnection.Close() を呼び出す
- この時点で接続は閉じられず、クライアント (アプリケーション) の接続プールに保持されます。MySqlConnection.Open(接続文字列) を再度実行すると、アプリケーションの接続プールから接続が作成/取得されます (接続ポーリングは MySqlConnection のインスタンスを返すだけです)。
私はこのコードでテストしました:
MySqlConnection conn = new MySqlConnection("server=localhost;uid=user;pwd=pass;database=dbname;Pooling=true");
try
{
conn.Open();
Console.WriteLine("Connected to sql server");
}
catch (MySqlException e)
{
Console.WriteLine("Error connecting to sql server ["+e.Message+"]");
}
MySqlCommand cmd = new MySqlCommand("select * from table1 where id = 1", conn);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string a = reader.GetString(0);
}
reader.Close();
try
{
conn.Close();
}
catch (MySqlException e) {}
// I connected to MySQL server via terminal and executed 'show full processlist'
// connection was still present
// If I add MySqlConnection.ClearAllPools(); connection was closed (everything as it should)
.NET ランタイムはどの時点でコネクタ MySqlConnection.ClearAllPools(); を呼び出しますか? または MySqlConnection.ClearPool() 静的メソッド? これらのメソッドは、実際に MySQL サーバーとの接続を閉じます。.NET アプリケーションがクラッシュした場合、wait_timeout が経過した後に MySQL 接続が閉じられますか。アプリケーションの実行の最後 (最後の行) で ClearAllPool() を呼び出す必要があります。