zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    poj2431 Expedition 题解报告
    poj1017 Packets 题解报告
    UVA714 Copying books 题解报告
    poj3040 Allowance 题解报告
    CH134 双端队列 题解报告
    poj2259 Team Queue 题解报告
    CH128 Editor 题解报告
    基本数据结构专题笔记
    CH109 Genius ACM 题解报告
    线段树总结
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13847160.html
Copyright © 2011-2022 走看看