C #을 연결 풀을 기반으로 MySQL의를 만들 수 있습니다

연결 풀 클래스 동작을 만들기

사용 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 ; // 십분 
            timer.AutoReset = true로 ; //이 실행 된 
        } 

        개인 정적 목록 <ConnectionItem> = listConnects 새로운 새로운 목록 <ConnectionItem> (); 


        개인  정적  읽기 전용  개체 obj_getConnects = 새 새  개체 ();
         공공 튜플 < BOOL , ConnectionItem> delwithConnectPool ( 문자열 형) 
        { 
            // 설정 조건은 동시 CRUD을 보장 할 때 상기 데이터의 고유성 
            잠금 (obj_getConnects) 
            { 
                BOOL에서 결과 = 거짓을 ; 
                ConnectionItem result_item = ,
                 스위치 (타입) 
                {
                    케이스  " 얻을 " :
                         VAR의 connectItem = listConnects.Where (U => u.ifBusy == 거짓 ) .FirstOrDefault (); 

                        경우 (connectItem == ) 
                        { 
                            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 =! 널 (null) && listConnects.Any ()) 
                        { 
                            // 연결, 닫힌 연결의 연결 상태가 해제되지 이분을 사용하지 않는 연결을 제거하기 위해 10 분 이상을 제거 
                            VAR을listOuteTimes = 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 = , 
                시간 = DateTime.Now, 
                mySqlConn = 새로운 MySqlConnection (연결) 
            }; 
            item.mySqlConn.Open (); 
            반환 항목을; 


        } 


        // 获取一个空闲连接
        공공 ConnectionItem getFreeConnectItem () 
        { 
            반환 delwithConnectPool를 ( " " .Item2을); 
        } 

        공공  INT getCount는 () {
             반환 listConnects.Count을; 
        } 

    } 



    공개 클래스 ConnectionItem :는 IDisposable 
    { 
        공공 날짜 시간 시간은 { 얻을 ; 설정 ; } 

        공공 MySqlConnection mySqlConn { 얻을 ; 설정 ; } 

        공공  부울 ifBusy { 얻을 ; 설정 ; } // 设置是否在使用
        공개  공극 setBusy ( BOOL 없음) 
        { 
            ifBusy = 없음; 
        } 

        공공  공극 updateTime (날짜 시간 DT) 
        { 
            시간 = DT; 
        }

        공개  공극 폐기 () 
        { 
            ifBusy = 거짓 ; 
        } 
    } 
}

 

다른 데이터베이스를 기반으로 MySQL을, 다른 연결 풀

사용하여 시스템;
사용 System.Collections.Generic 단계;
사용 System.Text 단계; 

네임 스페이스 CommonAssistant 
{ 
    공공  클래스 WorkDbConnectManage 
    { 
        # 지역连接池(1)
         개인  정적   MySqlConnectionPool tempPool_A = 널 (null) ;
        개인  정적  읽기 전용  문자열 dbConnect_A = " 데이터베이스 = ywthgoods; 데이터 소스 = 로컬 호스트, 포트 = 3306; 사용자 아이디 = 루트; 비밀 번호 = 123456; 문자셋 = UTF8, TreatTinyAsBoolean = 거짓; 사용자 변수 = TRUE 허용 " ; 



        개인  정적  읽기 전용  개체= 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의 

        # 지역의 연결 풀을 (2)
         개인  정적 MysqlConnectionPool tempPool_B = ;
         개인  정적  읽기 전용  문자열 dbConnect_B = "" ; 



        개인  정적  읽기 전용  개체 readPoolB_lock = 새로운 새로운  객체 () ;
         공공  정적 MysqlConnectionPool getTempPool_B () 
        { 
            // 이중 잠금 경우와 만 연결 풀을 생성하는 
            경우(tempPool_B == ) 
            { 
                로크 (readPoolB_lock) 
                { 
                    경우 (tempPool_A == ) 
                    { 
                        tempPool_A = 새로운 MySqlConnectionPool (dbConnect_B); 
                    } 
                } 
            } 
            반환 tempPool_A을; 
        } 



        공용  정적 ConnectionItem getWork1Conn_B () 
        { 
            반환 getTempPool_B ()를 getFreeConnectItem을 ().; 

        } 
        #endregion 

    } 
}

 

추천

출처www.cnblogs.com/-xyl/p/11454841.html