Access數據庫連接池

 

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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章