C#データベース接続プールの詳細

4514 ワード

C#データベース接続プールの使用
データベース・サーバへの接続は、通常、いくつかのソフト・ロング・ステップで構成されます.ソケットやネーミングパイプなどの物理チャネルを確立する必要があります.サーバと最初に接続する必要があります.接続文字列情報を分析する必要があります.サーバによって接続を認証する必要があります.
実際には、ほとんどのアプリケーションでは、1つまたは複数の異なる接続構成が使用されています.これは、アプリケーションのデータ量とアクセス量が大きい場合、アプリケーションの実行中に同じ接続の多くがオンとオフを繰り返し、データベース・サーバの効率が低下し、プログラムのクラッシュを引き起こすことを意味します.アプリケーションの安定性とパフォーマンスコストの削減を確保するために、ADO.NETでは接続プールと呼ばれる最適化手法を用いてメンテナンス接続を管理する.
C#データベース接続プールでは、接続の作成回数を減らすことができます.最小接続数(固定接続数)を定義します.ユーザーが接続のアップグレードでOpenを使用すると、接続プールで使用可能な接続があるかどうかを確認します.接続が使用可能であることが判明すると、新しい接続を作成するのではなく、呼び出し元に接続が戻されます.アプリケーションが接続でCloseを呼び出すと、接続プールは接続が最小接続数以内であるかどうかを判断します.実際に接続を閉じるのではなく、アクティブな接続プールに接続が回収されます.そうしないと、接続が焼失します.接続がプールに戻ると、次のOpen呼び出しで繰り返し使用できます.
C#データベース接続プールの作成
次の例では、C#を使用してSQLデータベースに接続します.
class DbConn  
  • {  

  • //usingSystem.Data;  
  • //usingSystem.Data.SqlClient;  

  • private const int MaxPool=10;//最大接続数
  • private const int MinPool=5;//最小接続数
  • private const bool Asyn_Process=true;//非同期アクセスデータベースの設定
  • private const bool Mars=true;//複数の、前方参照のみおよび読み取り専用の結果セット(ADO.NET 2.0)
  • が単一の接続で取得および管理される.
    private const int Conn_Timeout=15;//接続待ち時間の設定
  • private const int Conn_Lifetime=15;//接続のライフサイクルを設定する
  • private string ConnString="";//接続文字列
  • private SqlConnection SqlDrConn=null;//接続オブジェクト
  •  
  • public DbConn()/コンストラクション関数
  • {  
  • ConnString=GetConnString();  

  • SqlDrConn=new SqlConnection(ConnString);  
  • }  

  •  
  • private string GetConnString()  

  • {  
  • return"server=localhost;" 

  • +"integratedsecurity=sspi;" 
  • +"database=pubs;" 

  • +"MaxPoolSize="+MaxPool+";" 
  • +"MinPoolSize="+MinPool+";" 

  • +"ConnectTimeout="+Conn_Timeout+";" 
  • +"ConnectionLifetime="+Conn_Lifetime+";" 

  • +"AsynchronousProcessing="+Asyn_Process+";";  
  • //+"MultipleActiveResultSets="+Mars+";";  

  • }  
  •  

  • public DataTable GetDataReader(string StrSql)/データクエリー
  • {  

  • //接続が開いているときに閉じてから開け、データがタイムリーに更新できない場合を避ける
  • if(SqlDrConn.State==ConnectionState.Open)  

  • {  
  • SqlDrConn.Close();  

  • }  
  • try 

  • {  
  • SqlDrConn.Open();  

  • SqlCommand SqlCmd=new SqlCommand(StrSql,SqlDrConn);  
  • SqlDataReader SqlDr=SqlCmd.ExecuteReader();  

  • if(SqlDr.HasRows)  
  • {  

  • DataTable dt=new DataTable();  
  • //SqlDataReaderの内容
  • を読み込む
    dt.Load(SqlDr);  
  • //オブジェクトと接続を閉じる
  • SqlDr.Close();  
  • SqlDrConn.Close();  

  • return dt;  
  • }  

  • return null;  
  • }  

  • catch(Exceptionex)  
  • {  

  • System.Windows.Forms.MessageBox.Show(ex.Message);  
  • return null;  

  • }  
  • finally 

  • {  
  • SqlDrConn.Close();  

  • }  
  • }  

  • }  
    SqlDrConnを呼び出す.Open()メソッドで接続を開くと、接続プールが初期化され、設定された最小接続数が確立されます.接続プールの状況をより明確に理解するには、SQLのクエリー・アナライザを使用してストレージ・プロシージャsp_を実行します.Whoは、現在のデータベース・プロセスをリストし、loginname、dbnameを表示することでユーザーの接続情報を区別できますが、ログイン・クエリー・アナライザ自体が2つの接続を使用するので、別のユーザー名でクエリー・アナライザにログインすることが望ましいことに注意してください.この方法を使用すると、プロセス情報を常に「クエリーの実行」で更新するという面倒な点もあります.また、コントロールパネル→管理ツール→パフォーマンスを右クリックして計算機を追加し、パフォーマンスオブジェクトをSQlServer:GeneralStatistics(一般統計)を選択し、計算機がUserConnections(ユーザー接続)を選択して「追加」を押すことで、現在の接続数をリアルタイムで表示する方法もあります.
    ここでは、接続プールが実装されていますが、問題は実行中に発生することが多いです.接続プールの接続数がいっぱいになったらどうすればいいですか?ここでは、接続文字列のConnectTimeoutプロパティとConnectionLifetimeプロパティを適切に設定する必要があります.(上記説明)待ち時間を延長し、できるだけ接続が完了するたびにCloseメソッドを呼び出して接続を閉じるようにします.ただし、そこから避けられないこともあります.接続数がいっぱいで接続待ち時間を設定する時間を超えた場合、プログラムはInvalidOperationExceptio異常を起こします.この異常をキャプチャしてユーザーインタフェースにヒントを与えることができます「システムが忙しいので、後で接続してください......」などの情報でこの状況を緩和します.また、ADOを利用する別の方法もある.NET2.0新しい特性「非同期プロセス」は、データベースを非同期操作し、接続がCloseメソッドを呼び出して接続を閉じることを確保し、使用中の接続数を大幅に削減します.
    使用方法:接続文字列にAsynchronousProcessing=trueを付けると、非同期処理操作を使用することを示します.
    アプリケーションが接続プールを使用する必要がなくなった場合、ClearPoolまたはClearAllPoolsメソッドを使用して接続プールを空にしたり、接続プールをリセットしたりすることができます.方法は次のとおりです.
    SqlConnection.ClearPool(SqlConnectionconnection)関連する接続プールを空にします.
    SqlConnection.ClearAllPools()すべての接続プールをクリア
    上記の方法を呼び出します.接続が使用されている場合、接続プールは対応するマークを付け、接続が閉じたときに自動的に焼失します.
    小結C#データベース接続プール
    利点:データベースの操作とアクセスが頻繁な場合、接続の作成と開くのにかかる時間を短縮し、データベース・サーバのパフォーマンスを向上させます.
    欠点:データベース接続プールには、使用されていない複数の接続がデータベースに接続されている可能性があります.これは、リソースの浪費を意味します.