Access數據庫沒有數據庫連接池,每次打開和關閉數據庫時都非常耗時,自己編寫了一個簡易的數據庫連接池,添加數據庫類型還可支持其他沒有數據庫連接池的數據庫類型。 該數據庫連接池要求必須更改web.config中的數據庫連接字符串,添加Max Pool Size及Connect Timeout兩個屬性,如:<add name="AccessConnectString" connectionString="”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:"db.accdb;Max Pool Size=200;Connect Timeout=300"/>;,以獲取需要最大的連接數量及連接對象生存期。 該數據庫連接池是在關閉數據庫連接,檢驗其他連接對象的生存期,這樣在沒有發出關閉數據庫連接的請求時,一些已經超過生存期連接對象仍然在內存中,還無法做到與其他數據庫連接池同樣的效果。 數據庫連接池代碼如下: /// <summary> /// 連接對象。 /// </summary> public class Pool { /// <summary> /// 初始化。 /// </summary> /// <param name="id">代碼。</param> /// <param name="connection">數據庫連接對象。</param> /// <param name="isUse">使用標誌。</param> /// <param name="openTime">打開時間。</param> public Pool(Guid id, IDbConnection connection, bool isUse, DateTime openTime) { this.id = id; this.connection = connection; IsUse = isUse; OpenTime = openTime; } private Guid id; /// <summary> /// 獲取連接對象的代碼。 /// </summary> public Guid Id { get { return id; } } private IDbConnection connection; /// <summary> /// 獲取數據庫連接對象。 /// </summary> public IDbConnection Connection { get { return connection; } } /// <summary> /// 獲取或設置一個值,該值指示連接對象是否已經使用,true-已經使用,否則沒有使用。 /// </summary> public bool IsUse { get; set; } /// <summary> /// 獲取或設置連接對象打開數據庫的時間。 /// </summary> public DateTime OpenTime { get; set; } } /// <summary> /// 連接池管理類。 /// </summary> public static class ConnectionPool { private static List<Pool> pools = new List<Pool>(); private static int poolTimeout = 300; private static int maxPoolSize = 200; private static string connectString = ""; private static bool getParam = false; static ConnectionPool() { } /// <summary> /// 獲取參數。 /// </summary> /// <param name="connectionString">配置文件中的數據庫連接字符串。</param> private static void GetParams(string connectionString) { string[] connectStrings = connectionString.Split(';'); StringBuilder newConnectString = new StringBuilder(); foreach (string subConnectString in connectStrings) { if (subConnectString.IndexOf("Provider", StringComparison.InvariantCultureIgnoreCase) != -1 || subConnectString.IndexOf("Data Source", StringComparison.InvariantCultureIgnoreCase) != -1) { newConnectString.Append(subConnectString); newConnectString.Append(";"); } if (subConnectString.IndexOf("Max Pool Size", StringComparison.InvariantCultureIgnoreCase) != -1) { string[] poolSizeses = subConnectString.Split('='); maxPoolSize = int.Parse(poolSizeses[1]); } if (subConnectString.IndexOf("Connect Timeout", StringComparison.InvariantCultureIgnoreCase) != -1) { string[] timeouts = subConnectString.Split('='); poolTimeout = int.Parse(timeouts[1]); } } connectString = newConnectString.ToString(); getParam = true; } /// <summary> /// 根據數據庫類型創建數據庫。 /// </summary> /// <param name="connectType">數據庫連接類型。</param> /// <returns>指定數據庫連接類型的數據庫連接對象。</returns> private static IDbConnection CreateConnection(ConnectionType connectType) { switch (connectType) { case ConnectionType.OleConnectionType: return new OleDbConnection(connectString); default: throw new Exception("此數據庫類型不能使用此連接池。"); } } /// <summary> /// 根據數據庫連接字符串及數據庫類型創建連接對象。 /// </summary> /// <param name="connectionString">數據庫連接字符串。</param> /// <param name="connectType">數據庫類型。</param> /// <returns>連接對象。</returns> public static Pool Open(string connectionString, ConnectionType connectType) { lock (typeof(ConnectionPool)) { if (!getParam) { GetParams(connectionString); } foreach (Pool pool in pools) { if (!pool.IsUse) { pool.IsUse = true; pool.OpenTime = DateTime.Now; return pool; } } if (pools.Count >= maxPoolSize) { throw new Exception("連接池的連接數已經超過最大值,不能再提供數據庫連接。"); } Pool newPool = new Pool(Guid.NewGuid(), CreateConnection(connectType), true, DateTime.Now); pools.Add(newPool); newPool.Connection.Open(); return newPool; } } /// <summary> /// 關閉數據庫連接。 /// </summary> /// <param name="closePool">需要關閉的連接池對象。</param> public static void Close(Pool closePool) { for (int num = pools.Count - 1; num >= 0; num--) { if (pools[num].Id == closePool.Id) { pools[num].IsUse = false; } else { if (pools[num].IsUse) { continue; } TimeSpan time = DateTime.Now - pools[num].OpenTime; if (time.TotalSeconds > poolTimeout) { pools[num].Connection.Close(); pools.Remove(pools[num]); } } } } } 調用代碼: private connectionString = ConfigurationManager.ConnectionStrings[“AccessConnectString”].ToString(); //獲取連接對象 private Pool pool=ConnectionPool.Open(connectionString, ConnectionType.OleConnectionType); //獲取數據庫連接對象 IDbConnection dbConnection= pool.Connection; 數據庫操作 //關閉數據庫連接 ConnectionPool.Close(pool);