接続プール・クラスの操作を作成します。
使用MySql.Data.MySqlClientを、 使用してシステムを、 使用System.Collections.Genericを、 使用してSystem.Linqのを、 使用System.Textのを、 使用System.Timersと、 名前空間CommonAssistant { パブリック クラスMysqlConnectionPool { プライベート 読み取り専用 文字列のSQLConnect = ストリング.Empty; 公共 MysqlConnectionPool (文字列接続) { のSQLConnect = 接続; // タイマーポーリング接続、接続を洗浄するために使用されていない VARを=タイマ新しい新しいタイマ(); timer.Enabled = trueに、 timer.Elapsed + =(A、B)=> { // ポーリング接続プール、接続条件削除 delwithConnectPool(" 削除する" ); Console.WriteLineを(" コネクション:" + 同様にgetCount()); }; timer.Interval = 1000年 * 10 ; // 10分 timer.AutoReset = trueに ; // 実行されて } プライベート 静的リスト<ConnectionItem> = listConnects 新しい新しいリスト<ConnectionItem> (); プライベート 静的 読み取り専用 オブジェクト obj_getConnects = 新しい新しい オブジェクト(); 公共タプル< BOOL、ConnectionItem> delwithConnectPool(文字列型) { //は、設定された条件は同時CRUDを確保しますデータの一意性 ロック(obj_getConnects) { BOOLの結果= falseに、 ConnectionItem result_item = NULL ; スイッチ(タイプ) { ケース " 取得" : VAR connectItem = listConnects.Where(U => u.ifBusy == 偽).FirstOrDefault(); もし(connectItem == NULL ) { listConnects.Add(result_item = のgetInstance(SQLCONNECT))。 } 他{ 場合(connectItem.mySqlConn.State == System.Data.ConnectionState.Open) { connectItem.setBusy(真)。 connectItem.updateTime(DateTime.Now); result_item = connectItem; } 他{ listConnects.Add(result_item = のgetInstance(SQLConnectの)); } } BREAK ; ケース " 削除" : IF(listConnects =!ヌル && listConnects.Any()) { // 閉じた接続の接続状態、接続を解放しないように、2分を使用して未使用の接続を除去するために10分以上を除去 VARlistOuteTimes = listConnects.Where(U =>(u.ifBusy == 真 &&(DateTime.Now - u.time).TotalSeconds> 120)||((DateTime.Now - u.time).TotalSeconds> 60 * 10) ||(u.mySqlConn.State =!System.Data.ConnectionState.Open)); foreachの(VARの項目でlistOuteTimes) { item.mySqlConn.Close()。 item.mySqlConn.Dispose(); // 释放 } // 超时连接移除 listConnects.RemoveAll(U =>(u.ifBusy == 真 &&(DateTime.Now - u.time).TotalSeconds> 120)||((DateTime.Now - u.time).TotalSeconds> 60 * 10)|| (!u.mySqlConn.State = System.Data.ConnectionState.Open)); } ブレーク; } 戻り 新しいタプル< BOOL、ConnectionItem> (その結果、result_item)。 } } パブリック ConnectionItemのgetInstance(列接続) { VARのアイテム= 新しいConnectionItem() { ifBusyは = trueを、 時間 = DateTime.Now、 mySqlConn = 新しいMySqlConnectionに(接続します) }。 item.mySqlConn.Open(); 戻り値の項目。 } // 获取一个空闲连接 公共ConnectionItem getFreeConnectItem() { 戻り(delwithConnectPoolを" 取得" ).Item2。 } 公共 INT 同様にgetCount(){ 戻りlistConnects.Countと、 } } パブリック クラスConnectionItem:IDisposableを { 公共のDateTime時間{ 得ます。セット; } 公共 MySqlConnectionにmySqlConn { 得ます。セット; } パブリック ブール ifBusy { 得ます。セット ; } // 设置是否在使用 公共 ボイド setBusy(BOOL ビジー) { ifBusy = ビジー。 } 公共 ボイドupdateTime(DateTime型DT) { 時間 = DT。 } 公共 ボイド廃棄() { ifBusy = 偽。 } } }
異なるデータベースに基づいてMysqlの、異なる接続プール
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Textのを。 名前空間CommonAssistant { パブリック クラスWorkDbConnectManage { #region连接池(1) プライベート 静的 MySqlConnectionPool tempPool_A = NULL ; プライベート 静的な 読み取り専用 の文字列 dbConnect_A = " データベース= ywthgoods;データソース= localhostの; PORT = 3306;ユーザーID =ルート;パスワード= 123456;文字セット= UTF8; TreatTinyAsBoolean = falseは、ユーザー環境変数を許可する=真" ; プライベート 静的 読み取り専用 オブジェクト= readPoolA 新しい新しい オブジェクト(); 公共の 静的MysqlConnectionPool getTempPool_A() { // ダブルロックする場合、のみ接続プールを作成する必要がある 場合(tempPool_A == NULL ) { ロック(readPoolA) { 場合(tempPool_A == NULL ) { tempPool_A = 新しい新しいMysqlConnectionPool(dbConnect_A); } } } 戻りtempPool_Aを; } 公共の 静的GetWork1Conn_A ConnectionItem() { 戻りgetTempPool_A()getFreeConnectItem();. } #Endregionの #regionの(2)接続のプールを プライベート 静的 MysqlConnectionPool tempPool_B = NULL ; プライベート 静的 読み取り専用 文字列 dbConnect_B = "" ; プライベート 静的 読み取り専用 オブジェクト readPoolB_lock = 新しい新しい オブジェクト() ; パブリック 静的MysqlConnectionPool getTempPool_B() { // 場合のみダブルロックし、接続プールを作成する必要がある 場合(tempPool_B == NULL ) { ロック(readPoolB_lock) { 場合(tempPool_A == NULL ) { tempPool_A = 新しいMySqlConnectionPool(dbConnect_B)。 } } } 戻りtempPool_Aと、 } パブリック 静的ConnectionItem getWork1Conn_B() { 戻り)(getTempPool_BをgetFreeConnectItem()。 } #endregion } }