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);
  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13847160.html
Copyright © 2011-2022 走看看