연결 풀 클래스 동작을 만들기
사용 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 } }