注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

c#数据库连接池  

2013-03-08 15:54:43|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
c#数据库连接池


在前面的BLOG中VC-Ado数据库连接池 (http://fpcfjf.blog.163.com/blog/static/5546979320130305316342/),其实在别的环境下同样会发生这样的问题,比如最近工程中,当访问一个数据库时,操

作时间较长,而此时同时操作另外一个网页做同样的动作,那么程序会自动返回异常(前面写的“Silverlight开发之三异常”用到了)。
其实当时就想到了可能是一个connection正在操作,因为使用的是单实例,当然另外一个操作过来,前一个操作尚未完成,就会叠加引起连接错误,其实就是报类似于一个异步操作尚未完成之类的东西

。既然找了原因,那么问题就好解决了,老样子,上一个连接池就好了。原来的数据操作写得比较容易扩展,当时主要是考虑如何回收用过的连接池,以及在实际中测试连接池得分配状态。所以有些处

理想得复杂了,后来在回去的路上想直接再加一层不就好了。记得某位大牛说过,计算机的问题,只要加一层中间层,都可以解决。
好,那么先看原来的结构:

   public class DbAccess
    {
        ...............................            此处代码省略
        public static SqlControl SQLSERVER
        {
            get
            {
                if (null == s_SqlDataBase)
                {
                    CreateSqlInstance();
                }

                return s_SqlDataBase;
            }
        }
        ....................................
        /// <summary>
        /// 创建SQL实例
        /// </summary>
        /// <returns></returns>
        private static bool CreateSqlInstance()
        {
            s_SqlDataBase = new SqlControl();
            if (s_SqlDataBase.Open())
            {
                return true;
            }

            return false;
        }
    } 
那么再加入一层中间结构:
/*************************************************************************
** 文件名:   DataBasePool.cs
×× 主要类:   DataBasePool

 * ***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.Common;

namespace LeaderAttend.Web.DbAccess
{
    public class DataBasePool
    {
        #region 变量
        private  Collection<SqlControl> m_sqlPool = new Collection<SqlControl>();
        private object m_oObject = new object();
        #endregion

        public DataBasePool()
        {
            this.CreatePoolCon();
        }

        /// <summary>
        /// 获得当前一个连接实例
        /// </summary>
        /// <returns></returns>
        private  SqlControl GetInstaceFromPool()
        {
            try
            {
                //判断连接池是否为空
                if (m_sqlPool.Count <= 0)
                {
                    this.CreatePoolCon();
                }

                //取得连接并打开
                SqlControl sc = m_sqlPool[0];
                this.UsePoolCon(0);
                return sc;
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 创建连接
        /// </summary>
        /// <returns></returns>
        private bool CreatePoolCon()
        {
            try
            {
                lock (this.m_oObject)
                {
                    for (int num = 0; num < 3; num++)
                    {
                        SqlControl sc = new SqlControl(); 
                        sc.Open();
                        m_sqlPool.Add(sc);
                    }
                }
            }
            catch (Exception e)
            {
                return false;
            }

            return true;
        }
        /// <summary>
        /// 使用连接
        /// </summary>
        /// <param name="sc"></param>
        /// <returns></returns>
        private  bool UsePoolCon(SqlControl sc)
        {
            try
            {
                lock (this.m_oObject)
                {
                    m_sqlPool.Remove(sc);
                }
            }
            catch (Exception e)
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// 重载使用连接对象
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private bool UsePoolCon(int index)
        {
            try
            {
                lock (this.m_oObject)
                {
                    m_sqlPool.RemoveAt(index);
                }
            }
            catch (Exception e)
            {
                return false;
            }

            return true;
        }
        /// <summary>
        /// 未使用实例送回队列
        /// </summary>
        /// <param name="sc"></param>
        /// <returns></returns>
        public bool ClosePoolCon(SqlControl sc)
        {
            try
            {
                lock (this.m_oObject)
                {
                    m_sqlPool.Add(sc);
                }
            }
            catch (Exception e)
            {
                return false;
            }

            return true;
        }
        #region 操作函数
        /// <summary>
        /// 执行SQL命令
        /// </summary>
        /// <param name="sSql"></param>
        /// <returns></returns>
        public bool ExecuteSql(string sSql)
        {
            bool bRet     = false;
            SqlControl sc = this.GetInstaceFromPool();
            int iRet      = sc.ExecuteSql(sSql);         

            if ( iRet > 0)
            {
                bRet = true;
            }

            //回收连接资源
            this.ClosePoolCon(sc);

            return bRet;
        }
        /// <summary>
        /// 选择返回表
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public DataTable SelectDT(string sql, string name)
        {
            SqlControl sc = this.GetInstaceFromPool();
            DataTable dt  = sc.SelectDT(sql,name);
            //回收连接资源
            this.ClosePoolCon(sc);
            return dt;
        }

    }
}

然后再在原来的DbAccess中增加一个静态属性:
        public static DataBasePool SQLSERVERPOOL
        {
            get
            {
                if (null == s_DbPool)
                {
                    CreateDbPoolInstance();
                }

                return s_DbPool;
            }
        }

        private static bool CreateDbPoolInstance()
        {
            try
            {
                s_DbPool = new DataBasePool();
            }
            catch
            {
                return false;
            }

            return true;
        }

这样的话,原来上层使用的编码风格和代码基本不会改动,只是改动一下属性的名字就可以了。
从这里可以看出来,写程序一定要做总体的架构,才能在再后来的扩展中更方便。
正如古人说得好:凡事预则立,不预则废。


  评论这张
 
阅读(730)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017