0

最近、接続プーリングについて読みました ( msdnmysql のドキュメント)。

接続プールの目的は、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() を呼び出す必要があります。

4

1 に答える 1

1

指定した MSDN リンクから

指定されたMinPoolSizeが 0 より大きい場合、AppDomainがアンロードされてプロセスが終了するまで、接続プールは破棄されません。

さらに遠く

フェイルオーバーなどの致命的なエラーが発生すると、プールは自動的にクリアされます。

そのため、アプリケーションの終了時に接続がクリーンアップされます。

close()接続を確立し、メソッドを使用した後もまだ開いていることを確認し、アプリケーションのクラッシュを引き起こすことで、これをテストできるはずです。

于 2014-05-15T09:13:25.920 に答える