一点体会:数据库的连接其实有两个层次,你的程序到provider的连接(就是那些sqlconnection,oledbconnection),另外还有provider到数据库的连接,默认条件下,第一个连接断了,第二个也就断了。但这点可以通过连接池来处理,可以得到更好的性能。很多人在想怎样自己写程序来管理第一层的连接池,写一个较通用的类来实现。其实这没有必要,系统已经提供了对第二层的连接池的管理功能了。在你的connectionstring里加上 Max Pool Size=25;Min Pool Size=5,一个系统自动管理的连接池就建立好了。这样,程序里对连接的操作,就不会影响第二层的连接池,你可以自由打开或关闭连接,系统自动保持5个以上的与数据库的连接。这一点,你可以从EM的ACTIVE观察到。根据你的应用程序的需要来设置最小/大的连接数就可以了。
而是SqlConnection的每次Open和CloseSqlServer的连接是持续的。
SqlConnection只是代理而已。
所以没当SqlConnection.Open一次,就调用sp_reset_connection来重新整理连接中的属性和变量。
否则可能和下次的时候产生冲突。
好心你下载一下SqlScope,然后看看里面的例子吧。
的确是这样,例如
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);
}
}
大概根本就不可能内层自动探测外层的操作,只能通过对象传递了这本来就有点违背逻辑
或者提供把SqlScope安装在线程Data上也可以。
lostinet,麻烦你详细说说这两种方法好吗?
{
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();
}
}
但还有个疑问~~一般来说,方法A和方法B不会存在于一个类里,也就不会存在于一个对象中,那怎么办?
方法A继承了这个基类,方法B也继承了这个基类,但他们各自创建了自己的对象啊!每次建立对象的时候,默认情况下SqlScope是不存在的,那还不是相当于建立了两个SqlScope,还是会执行那个过程啊?想过用静态方法做基类来继承,但感觉会出错?顺便问一下,一个类如何继承多个基类?似乎没有书提到过这个?
而是由ForumAccess创建的。
这个SqlScope贯穿整个请求的处理过程。
中途用到这个SqlScope的对象就多了。ForumModule
ForumPage
某些用户控件
等。。
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;
}
}
方法a与方法b存在于不同的类,并且要在方法c中同时调用着两个方法,现在要做到的是
方法a和b都不知道方法c是否有可用的SqlScope对象,他们必须要智能的去探测方法c是否有,有的话,则调用其对象做数据操作,没有的话,就各自建立一个对象来做数据操作但调用方法a和b的方法又不仅仅只有c还有很多,所以他们之间不能有半点的偶合关系,请问怎么做到,能否举个例子?
例如
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;
}
}
}....
lostinet大哥,能否就说说
-----------------------
比如:有三个方法a、b、c 分别存在于三个类中
方法a与方法b存在于不同的类,并且要在方法c中同时调用着两个方法,现在要做到的是
方法a和b都不知道方法c是否有可用的SqlScope对象,他们必须要智能的去探测方法c是否有,有的话,则调用其对象做数据操作,没有的话,就各自建立一个对象来做数据操作但调用方法a和b的方法又不仅仅只有c还有很多,所以他们之间不能有半点的偶合关系,请问怎么做到,能否举个例子?-----------------------
这样的例子呢?
这个是怎么都要执行的,做了pool也是要执行滴,得减少这个操作