在sql server2000里是不是每次和数据库断开连接就会执行sp_reset_connection一次?
在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





