CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

在sql server2000里是不是每次和数据库断开连接就会执行sp_reset_connection一次?

楼主kills(kill ***)2003-12-24 01:57:22 在 .NET技术 / ASP.NET 提问

在sql   server2000里是不是每次和数据库断开连接就会执行sp_reset_connection一次?  
  那如何保持一个连接呢?比如我在一个比较大的范围内开启一次连接,而在这个范围内调用其他方法中产生的数据连接就不再打开,直接使用这个范围的连接?一直到范围结束后再断开执行sp_reset_connection呢?  
   
  不考虑将数据库连接对象或者引用传递给那些方法  
   
  各位高手,请指教指教,很头疼的问题,我的程序由于太多的模块化了,执行了太多的sp_reset_connection……很头疼 问题点数:20、回复次数:31Top

1 楼cnlamar(无中生有)回复于 2003-12-24 02:00:33 得分 10

markTop

2 楼dawave()回复于 2003-12-24 02:49:25 得分 0

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

3 楼Lostinet(Hello)回复于 2003-12-24 08:52:47 得分 10

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

4 楼cnlamar(无中生有)回复于 2003-12-24 10:22:21 得分 0

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

5 楼Lostinet(Hello)回复于 2003-12-24 10:44:08 得分 0

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

6 楼shenanigan(宝宝)回复于 2003-12-24 10:51:04 得分 0

楼上,哪里有下载,我也要看看.Top

7 楼Lostinet(Hello)回复于 2003-12-24 10:58:35 得分 0

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

8 楼cnlamar(无中生有)回复于 2003-12-25 03:52:29 得分 0

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

9 楼cnlamar(无中生有)回复于 2003-12-25 17:06:44 得分 0

upTop

10 楼stpangpang(胖在一方)回复于 2003-12-25 17:33:14 得分 0

关注~Top

11 楼cnlamar(无中生有)回复于 2003-12-25 18:08:41 得分 0

upTop

12 楼cnlamar(无中生有)回复于 2003-12-25 18:28:31 得分 0

upTop

13 楼cnlamar(无中生有)回复于 2003-12-25 21:59:53 得分 0

upTop

14 楼Lostinet(Hello)回复于 2003-12-25 22:11:40 得分 0

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

15 楼cnlamar(无中生有)回复于 2003-12-25 22:45:53 得分 0

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

16 楼Lostinet(Hello)回复于 2003-12-25 23:34:32 得分 0

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

17 楼cnlamar(无中生有)回复于 2003-12-25 23:46:52 得分 0

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

18 楼Lostinet(Hello)回复于 2003-12-26 09:05:33 得分 0

我的那个下载里有详细的例子啊。  
   
  例如我在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();  
  }  
  }  
   
   
  Top

19 楼cnlamar(无中生有)回复于 2003-12-26 13:55:03 得分 0

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

20 楼cnlamar(无中生有)回复于 2003-12-26 15:42:29 得分 0

upTop

21 楼Lostinet(Hello)回复于 2003-12-26 16:17:50 得分 0

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

22 楼Lostinet(Hello)回复于 2003-12-26 16:20:06 得分 0

上面的  
  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;  
  }  
  }  
  Top

23 楼cnlamar(无中生有)回复于 2003-12-26 17:10:23 得分 0

小弟才疏学浅,越看越糊涂了。。。  
  能否举个例子,多个类产生多个对象中自动使用一个对象来持续连接,万分感谢!!  
   
  Top

24 楼cnlamar(无中生有)回复于 2003-12-26 17:16:51 得分 0

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

25 楼Lostinet(Hello)回复于 2003-12-26 17:28:18 得分 0

有很多种做法。  
  例如  
  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;  
  }  
  }  
  }  
   
  ....  
   
   
  Top

26 楼senzz(森)回复于 2003-12-26 18:00:26 得分 0

旁听................Top

27 楼cnlamar(无中生有)回复于 2003-12-27 17:46:28 得分 0

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

28 楼cnlamar(无中生有)回复于 2003-12-28 03:00:51 得分 0

upTop

29 楼Lostinet(Hello)回复于 2003-12-28 09:51:37 得分 0

晕,上面不是举了例子了嘛~~随便拿一个都能应用。  
  Top

30 楼dawave()回复于 2003-12-31 02:44:17 得分 0

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

31 楼cnlamar(无中生有)回复于 2003-12-31 03:03:49 得分 0

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

相关问题

  • VC中如何断开用户与SQL Server的连接?
  • ADO如何真正断开SQL-Server数据连接?
  • SQL占用CPU100%,把网络断开后就好了!
  • 如何通过代码断开某SQL Server数据库应用程序连接?
  • 怎样断开指定数据库的所有连接(sql命令)
  • 断开网络
  • 如何用T-SQL语句实现断开指定数据库中的所有链接?
  • ADOConntion1 控件,链接数据库后,如何才能彻底的断开与SQL server 2000 的连接
  • 兄弟们有这个问题吗? 一启动sql server,无线网络就断开啦!
  • 断开网络,网络断开

关键词

  • sql server2000
  • 连接
  • 数据库
  • 执行
  • 数据
  • sqlscope
  • isqlscope
  • 方法
  • 调用
  • ss

得分解答快速导航

  • 帖主:kills
  • cnlamar
  • Lostinet

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo