一点体会:数据库的连接其实有两个层次,你的程序到provider的连接(就是那些sqlconnection,oledbconnection),另外还有provider到数据库的连接,默认条件下,第一个连接断了,第二个也就断了。但这点可以通过连接池来处理,可以得到更好的性能。很多人在想怎样自己写程序来管理第一层的连接池,写一个较通用的类来实现。其实这没有必要,系统已经提供了对第二层的连接池的管理功能了。在你的connectionstring里加上 Max Pool Size=25;Min Pool Size=5,一个系统自动管理的连接池就建立好了。这样,程序里对连接的操作,就不会影响第二层的连接池,你可以自由打开或关闭连接,系统自动保持5个以上的与数据库的连接。这一点,你可以从EM的ACTIVE观察到。根据你的应用程序的需要来设置最小/大的连接数就可以了。

解决方案 »

  1.   

    不是 SqlServer的每次连接和断开,
    而是SqlConnection的每次Open和CloseSqlServer的连接是持续的。
    SqlConnection只是代理而已。
    所以没当SqlConnection.Open一次,就调用sp_reset_connection来重新整理连接中的属性和变量。
    否则可能和下次的时候产生冲突。
      

  2.   

    如lostinet所言,是这么回事,我希望的就是在大范围内保持这个代理连接:)或者说被调用的方法能自动检测调用自己的方法是否存在数据连接,如果存在则自动引用进来,然后使用这个数据连接来做数据操作,可能实现吗?请问一下,你的论坛存在这个问题吗?如何解决的?好久没看见你了,在你的论坛上,你消失了很久了,哈哈
      

  3.   

    楼上。你说的这些不就是我的SqlScope做的嘛。
    好心你下载一下SqlScope,然后看看里面的例子吧。
      

  4.   

    http://www.lostinet.com/files/sqlscope.rar
      

  5.   

    Lostinet,你的SqlScope我看过的,却不知道还支持这个的?!我说的可是这样,在方法a中调用方法B,而方法B里也自己调用了数据库对象来读数据,现在方法B要去自动检测方法A中是否存在可用的数据连接,有则引用,无则建立新的,是这样吗?如果是,麻烦指点一下,关于这个实现的代码在SqlScope的什么地方?
      

  6.   

    to:cnlamar(无中生有)
    的确是这样,例如
    public void DeleteItem(ISqlScope ss,int id)
    {
    using(ss.EnterQuery()) //打开连接
    {
    ClearSubItems(ss,id);
    ss.ExecuteNonQuery("delete items where id=@p0",id);
    //关闭连接
    }
    }
    public void ClearSubItems(ISqlScope ss,int itemid)
    {
    using(ss.EnterQuery())//如果被DeleteItem调用,那么就不需要重新打开了
    {
    ss.ExecuteNonQuery("delete subitems where itemid=@p0",itemid);
    }
    }
      

  7.   

    但lostinet你发现了吗?你是通过传递ss对象实现的?不是自动检测的哟?
    大概根本就不可能内层自动探测外层的操作,只能通过对象传递了这本来就有点违背逻辑
      

  8.   

    把SqlScope作为类成员就不用传参啦.
    或者提供把SqlScope安装在线程Data上也可以。
      

  9.   

    能自动检测的吗?
    lostinet,麻烦你详细说说这两种方法好吗?
      

  10.   

    我的那个下载里有详细的例子啊。例如我在Web工程里通常是这样用的:public class PageBase:Page
    {
    public ISqlScope SqlScope
    {
    get
    {
    if(_ss==null)
    _ss=new SqlScopeImpl(ConfigurationSettings.AppSettings["ConnectionString"]);
    return _ss;
    }
    }
    ISqlScope _ss; public override Dispose()
    {
    base.Dispose();
    if(_ss!=null)
    _ss.Dispose();
    }
    }而在具体的页面内:public class GridForm1 : PageBase
    {
    public void BindGrid()
    {
    DataGrid1.DataSource=SqlScope.ExecuteDataSet("select * from tablename");
    DataGrid1.DataBind();
    }
    }
      

  11.   

    对哦,我还曾经向你请教过“需要时执行”的嘛,呵呵,怎么忘记了?
    但还有个疑问~~一般来说,方法A和方法B不会存在于一个类里,也就不会存在于一个对象中,那怎么办?
    方法A继承了这个基类,方法B也继承了这个基类,但他们各自创建了自己的对象啊!每次建立对象的时候,默认情况下SqlScope是不存在的,那还不是相当于建立了两个SqlScope,还是会执行那个过程啊?想过用静态方法做基类来继承,但感觉会出错?顺便问一下,一个类如何继承多个基类?似乎没有书提到过这个?
      

  12.   

    就拿我的论坛来说,SqlScope不是被Page创建的,
    而是由ForumAccess创建的。
    这个SqlScope贯穿整个请求的处理过程。
    中途用到这个SqlScope的对象就多了。ForumModule
    ForumPage
    某些用户控件
    等。。
      

  13.   

    上面的
    public ISqlScope SqlScope
    {
    get
    {
    if(_ss==null)
    _ss=new SqlScopeImpl(ConfigurationSettings.AppSettings["ConnectionString"]);
    return _ss;
    }
    }
    只是举例而已。实际上意思是 public ISqlScope SqlScope
    {
    get
    {
    if(_ss==null)
    _ss=取得相关的SqlScope
    return _ss;
    }
    }
      

  14.   

    比如:有三个方法a、b、c 分别存在于三个类中
    方法a与方法b存在于不同的类,并且要在方法c中同时调用着两个方法,现在要做到的是
    方法a和b都不知道方法c是否有可用的SqlScope对象,他们必须要智能的去探测方法c是否有,有的话,则调用其对象做数据操作,没有的话,就各自建立一个对象来做数据操作但调用方法a和b的方法又不仅仅只有c还有很多,所以他们之间不能有半点的偶合关系,请问怎么做到,能否举个例子?
      

  15.   

    有很多种做法。
    例如
    class A,B,C都是这样的:
    pulbic class A
    {
    public A(ISqlScope ss)
    {
    _ss=ss;
    }
    }
    那么A、B、C的创建者应该提供ISqlScope给ABC或者
    public class A
    {
    public ISqlScope SqlScope
    {
    get;set;
    }
    }
    同样,谁控制ABC,就应该由谁来提供SqlScope或者在传递参数的时候指定ISqlScope
    public class A
    {
    public void MethodA(ISqlScope ss)
    {
    }
    }或者
    public class A
    {
    public ISqlScope SqlScope
    {
    return 其他类.GetCurrentSqlScope();//和HttpContext.Current一样
    }
    }或者A,B,C都有共同的Owner,采用Owner的设置
    public class A
    {
    D _d;
    public A(D d)
    {
    _d=d;
    }
    public ISqlScope SqlScope
    {
    get
    {
    return _d.SqlScope;
    }
    }
    }或者
    通过某种方法得到SqlScope的载体,然后再得到SqlScope
    例如
    public class TheCtrl : UserControl
    {
    public ISqlScope SqlScope
    {
    get
    {
    return ((PageBase)Page).SqlScope;
    }
    }
    }或者
    使用全局的ISqlScope,(例如在控制台程序中)public class A
    {
    public ISqlScope SqlScope
    {
    get
    {
    return App.SqlScope;
    }
    }
    }....
      

  16.   

    看不懂,举了太多例子,我头都晕了@_@
    lostinet大哥,能否就说说
    -----------------------
    比如:有三个方法a、b、c 分别存在于三个类中
    方法a与方法b存在于不同的类,并且要在方法c中同时调用着两个方法,现在要做到的是
    方法a和b都不知道方法c是否有可用的SqlScope对象,他们必须要智能的去探测方法c是否有,有的话,则调用其对象做数据操作,没有的话,就各自建立一个对象来做数据操作但调用方法a和b的方法又不仅仅只有c还有很多,所以他们之间不能有半点的偶合关系,请问怎么做到,能否举个例子?-----------------------
    这样的例子呢?
      

  17.   

    真晕了,还在为这个问题发愁,framework已经在系统一级实现pooling了,怎么大家还在犯愁呢?
      

  18.   

    sp_reset_connection
    这个是怎么都要执行的,做了pool也是要执行滴,得减少这个操作