Class A: IDisposable
{
SqlConnection conn;
function A1
{
conn = new SqlConnection(...)
conn.open
?conn.close
}
function A2
{
conn....
}
Dispose
{
?conn.close
}
}
函数A1和A2都要用到conn,调用情况为单独调用A1,或者调用A1,A2。
问题是如果在A1中关闭conn,在A2中需要conn.open。
那么在Dispose中关闭conn是否更加好呢?
建议使用SqlConnection的时候,用的时候Open,不用的时候立刻Close
建议你这样写
Class A: IDisposable
{
SqlConnection conn;
function A1
{
conn = new SqlConnection(...)
conn.open()
conn.close()
}
function A2
{
conn.open()
....
}
Dispose
{
}
}
因为你长期保存一个持续的连接是很耗资源的
你调用Close方法后,并不是完全关掉连接
连接会回到连接池用
下次要使用的时候再调用open就好
总之,使用Connection的原则就是尽可能的使用短时间连接
要用才开,用完就关
ljfppp(刘三疯)回复于 2003-03-11 09:52:16 得分 20
在SqlConnection中,如果你是用DataAdapter.Fill()取数据的话,如果你的链接原先的状态是Open,则Fill方法执行完后不关闭链接,如果你的连接原先是Close状态,则Fill方法在开始执行时自动打开链接,在执行完毕后自动关闭链接,也就是说Fill方法将保持执行前后链接状态的一致。如果你不是用DataAdapter操作数据库的话,就要自己执行SqlConnection。Open()方法,然后执行SqlConnection.Close();当然,如果你操作数据库频繁的话,则建议你按下面的方式构造类:
Class A: IDisposable
{
SqlConnection conn;
function OpenCon()
{
conn = new SqlConnection(...)
conn.open
}
function CloseCon()
{
conn.Close()
}
function YourOperate()
{
//Execute your operate
}
}
这样就可以减少数据库打开和关闭的动作次数,提高性能。
不同意ljfppp(刘三疯)
执行Connection.Close()并不一定会关闭这个连接,只是告诉Framework,我的连接用完了,这样Framework会把这个连接放回到连接池。
当你new 一个连接的时候,只是new 一个connection对象,也不代表一定会重新开一个数据库连接,因为如果连接池有连接,会直接从连接池抓。
连接用完就关,这是个原则问题。
不信可以查看System.Data.Common.DbAdapter,这是DataAdapter的父类,当它Fill数据的时候,也是用完之后立即就关掉了。
To f2k(木头)
数据库连接的建立很耗资源,而持续连接更耗,所以,使用数据库连接要尽可能的短,而提高性能是通过连接池来完成的,所以你不必担心使用一次后,Close连接,下次开启会很慢,相反,这正是正确的用法。
可能,你想知道,连接池是谁来完成的,如何启用?
我可以告诉你,这个是不需要我们手动维护的,不过,你可以在设定ConnectionStr的时候设定是否启用连接池
下面是一些参数信息,你可以看一下:
Connection Lifetime 0 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。
如果值为零 (0),则将使池连接具有最大的超时期限。
Connection Reset 'true' 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返行程,但必须注意的是连接状态(如数据库上下文)不会被重置。
Enlist 'true' 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。
Max Pool Size 100 池中允许的最大连接数。
Min Pool Size 0 池中维护的最小连接数。
Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。
详细信息参见
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassconnectionstringtopic.htm
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm