接続プールベースのMySQLを作成するためのC#の

接続プール・クラスの操作を作成します。

使用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 

    } 
}

 

おすすめ

転載: www.cnblogs.com/-xyl/p/11454841.html