C# mysql 連接池
該連接池除了基本功能,還多增加了一個管理連接的功能,我看了別人寫的,沒有這個功能,所以臭屁地說這是我這個程序的亮點,哈哈。
這個管理連接的功能主要是創建了一個后臺線程,然后死循環,不斷檢測連接池中的連接是否空閑已久(比如空閑了10s),如果空閑已久,就把它關了。
剛學 C# 不久,如果有哪里不對或者需要改進的地方,還望指教。
using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; using System.Web.Configuration; namespace NetBlog.Data { /// <summary> /// Mysql 連接池 /// 單例模式 /// </summary> public class MysqlPool { /// <summary> /// 數據庫配置信息 /// </summary> private static string ConnectinString = ""; /// <summary> /// 連接池中的數據庫連接對象 /// </summary> private List<MySqlConnection> connections = null; /// <summary> /// 數據庫連接對象的狀態 /// true 為占用,false 為空閑 /// </summary> private List<bool> status = null; /// <summary> /// 目前連接對象的總數 /// </summary> private int total = 0; /// <summary> /// 目前在用的連接對象數量 /// </summary> private int inUseNum = 0; private static int minPoolSize = 10; private static int maxPoolSize = 100; /// <summary> /// 連接對象空閑存活時間 100s /// </summary> private static double activeTime = 10000; /// <summary> /// 空閑狀態起始時間 /// </summary> private Dictionary<int, double> idleTime = null; /// <summary> /// 單例 /// </summary> private static MysqlPool pool = null; /// <summary> /// 連接池創建時間 /// </summary> private DateTime startTime; /// <summary> /// 管理連接池的線程 /// </summary> private Thread thread = null; private MysqlPool() { this.connections = new List<MySqlConnection>(); this.status = new List<bool>(); this.idleTime = new Dictionary<int, double>(); this.startTime = DateTime.Now; // 將線程設置為后臺線程 // 使得在程序退出后,線程自動結束 this.thread = new Thread(this.ManagePool) { Name = "MysqlPoolManagerThread", IsBackground = true }; this.thread.Start(); } public static MysqlPool GetInstance() { lock (typeof(MysqlPool)) { if (pool == null) { pool = new MysqlPool(); } } return pool; } public MySqlConnection GetConnection() { lock (this.connections) { if (this.inUseNum == this.total) { // 連接已占滿 return CreateNewConnection(); } else { // 有空閑連接 for(int i = 0; i< this.status.Count; i++) { if (this.status[i]) { continue; } else { this.inUseNum++; this.status[i] = true; this.idleTime.Remove(i); return this.connections[i]; } } return null; } } } private MySqlConnection CreateNewConnection() { if (this.total < maxPoolSize) { MySqlConnection conn = new MySqlConnection(ConnectinString); this.connections.Add(conn); this.status.Add(true); this.total++; this.inUseNum++; return conn; } return null; } /// <summary> /// 歸還連接 /// 在方法結束前調用 conn = null 使用戶是去對連接對象的引用 /// 避免再次調用連接 /// </summary> /// <param name="conn"></param> public void ReleaseConnection(ref MySqlConnection conn) { if (conn == null) { return; } else { int index = this.connections.IndexOf(conn); if (index < 0) { conn.Close(); conn = null; } else { this.inUseNum--; this.status[index] = false; this.idleTime.Add(index, DateTime.Now.Subtract(this.startTime).TotalMilliseconds); conn = null; } } } /// <summary> /// 管理連接池 /// 將長時間處于空閑狀態的連接釋放 /// </summary> private void ManagePool() { while (true) { lock (this.connections) { // 已刪除連接個數 int num = 0; if (this.total-this.inUseNum > minPoolSize) { // 空閑連接大于最小連接池大小 // 將多余的空閑連接刪除 double mill = DateTime.Now.Subtract(this.startTime).TotalMilliseconds; for (int i = 0; i < this.connections.Count; i++) { double idle = this.idleTime[i]; if (mill > idle + activeTime) { int index = i - num; MySqlConnection conn = this.connections[index]; lock (conn) { conn.Close(); this.connections.RemoveAt(index); this.total--; this.status.RemoveAt(index); this.idleTime.Remove(i); } num++; } } } } Thread.Sleep(500); } } } }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!