大家一起来讨论这个问题吧!有关SqlConnection连接的!

pursuer 2002-07-18 10:30:04
加精
在用SqlConnection进行数据库操作时,SqlConnection连接是一开始就open,然后让它 一直保持Open状态好呢,还是每次进行一次操作时把它open,操作结束时再close
好呢!
这两个哪个更加耗系统资源!
如果SqlConnection conn;conn为static 那又怎么样呢?
...全文
286 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyou 2002-09-23
  • 打赏
  • 举报
回复
gz
wenzm 2002-08-27
  • 打赏
  • 举报
回复
怎么就每人吭声了呢!
wenzm 2002-08-17
  • 打赏
  • 举报
回复

我也一直在想这个问题,的确和很多人的看法一样,我也觉得每次OPEN,每次CLOSE 。但是,我现在有如下情况:

我在WEB工程中 写了一个数据访问类

Class DataAcess
{
//传入sGetFieldSQL返回一个DataTable
Public DataTable GetTable(string sGetFieldSQL)
{
……
}

//传入sGetFieldSQL返回一个DataSet
Public DataSet GetTable(string sGetFieldSQL)
{
……
}

//传入sSQL,更新数据表
public bool UpdateData(string sSQL)
{
……
}
//还有很多类似的方法,包括存储过程和以上方法的重载
}

然后我的WEB Solution中所有对数据库的访问操作都直接通过调用以上相关的方法来完成,现在有一个问题, 我的SQLConnection在那里来New,在那里来OPEN,什么时候CLOSE
有如下方法:
1. 我用一个Application变量来处理:在Global.asax中Application_Star中生成并OPEN SQLConnection,而在Application_End中来close。把以上的生成并打开的SQLConnection存放在Application中,而以上的方法中需要SQLConnection时候从Application中取得;
2.和方法1类似,也可以在 Global.asax的Global类中,定义一个SQLConnection类,new、OPEN、CLOSE操作和上同, 只是访问的时候不是从APPLICATION中取得SQLConnection,而是做为Global类中的一个Public属性(属性类型就是SQLConnection类拉)调用.我想只只是以上方法的“变种”,效率上应该是一样的!
3.我在以上DataAcess类的每个方法中,每次调用的时候都New并且OPEN一个SQLConnection,而通过Try……Catch……Finnally来保证方法调用完成后Close此SQLConnection;
4.我在DataAcess的构造函数中New 并且Open SQLConnection ,而在其析构函数中Close……
5.每个WEB页面需要调用DataAcess的时候,都New 并OPEN一个SQLConnection,而后访问DataAcess的时候传入 SQLConnection……


请大家帮我分析,以上几种方法中,那种最为合理和效率来得快!
注意,我的是WEB SOLUTION,或者还有什么更好的方法,请大家指点……
chen_funer 2002-08-16
  • 打赏
  • 举报
回复
当然是,每次进行一次操作时把它open,操作结束时再close.
因为ASP.NET是用了连接池的,开关的消耗并不大的
chars 2002-07-28
  • 打赏
  • 举报
回复
同意上面的说法,因为对于WEB编程,由于并发的人数,使用的人很多,如果立即关闭的话,可能会造成响应比较慢,并且也不利于网络传输,想想看,每次访问都先CONNECT OPEN,然后CONNECT CLOSE,在CONNECT,累不累啊!
Luyt 2002-07-28
  • 打赏
  • 举报
回复
.net中的数据库连接式被自动pool的,就是说,如果你使用一个连接字符串去连接一个数据库,当使用完成后,调用close时,这个连接并不是真的被关闭了,而是被放在一个数据库连接池中,而下次再次使用同一个连接字符串时,这个连接会被自动从池中取出,而不是重新生成一个新的,因此,调用close后再new一个新的并不会耗费时间。关键问题是两次使用的必须以同一个连接字符串,微软的文档也是这样推荐的。还有,如果在对象一级声明一个数据库连接,应该在使用时打开改连接,而使用完成后立即关闭,这样会可以及时地将连接放回到缓冲池中,供其他线程使用,不然只有到对象被释放时,连接才会被自动被关闭。尤其是在web开发中,如果将连接存入了Session而没有关闭,这样当这个Session有效时,数据库连接会被一直占用
当有大量的访问时,会建立大量的数据库连接,给造成服务器的负担,系统会变得不稳定。另一方面,如果对象的构造函数中使用了系统资源,如打开了文件或数据库连接,该应该使用Dispose模式,在dispose方法中释放资源,使用对象是要把对象申明在using中(这个using是一个语句,与使用命名空间不同,可以参考.net的帮助),超出using范围是系统会自动调用对象的dispose方法,要不然就自己手动管理。这样可以比较安全的使用数据库连接。可以参考visual studio .net中的duwamish的例子。
fishas 2002-07-28
  • 打赏
  • 举报
回复
数据库的连接并不会被共享,一个用户打开的连接不能够被第二个用户延用!
Hogwarts 2002-07-19
  • 打赏
  • 举报
回复
同意triout和redcaff_l的说法,除非特殊应用需要,connection应该被及时关闭以释放资源。

对于pursuer所关心的节省系统资源的问题,在ADO.NET中可以通过连接池来很好的解决。尤其在使用SqlClient的情况下,程序员完全可以随用随Open,然后用完就Close。Connection被Close以后会自动的存放在Connection Pool里面,只要在lift time范围之内再Open,就会从连接池里直接取用,相当于一个缓存的机制,能够大大减少对SQL Server的连接数。

即使是从连接池的角度来看,connection也应该被随时关闭,这样connection pool中的连接才能最大限度的得到利用。

关于连接池,有兴趣的网友可以参考这片帖子:http://www.csdn.net/expert/topic/874/874135.xml


Hogwarts - S(u)ddenly dis@ppeared...
-
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
mmkk 2002-07-19
  • 打赏
  • 举报
回复
也可以使用
using(SqlConnection)
{
//do something
}
相当于一个try...catch...finally块
aspcn 2002-07-19
  • 打赏
  • 举报
回复
如果是在一个类或者是一个页面中(也包括页面之间的操作频率很快时),建议不要打开后就关闭。。

ADO.Net中使用连接池,在一定的时间内打开的连接如果没有强制关闭他是不会自动关闭的,下次再用时,他就会直接从连接池中取,节约资源。
aspcn 2002-07-19
  • 打赏
  • 举报
回复
如果是在一个类或者是一个页面中(也包括页面之间的操作频率很快时),建议不要打开后就关闭。。

ADO.Net中使用连接池,在一定的时间内打开的连接如果没有强制关闭他是不会自动关闭的,下次再用时,他就会直接从连接池中取,节约资源。
zag 2002-07-19
  • 打赏
  • 举报
回复
同意楼上的说法,一般情况下(WinForm编程)建议处理完一个操作逻辑单元后关闭连接,不过对于特殊情况还需特殊对待;而对于WEB编程,则应该在需要时打开连接,不需要时立即关闭。
aspritionisdead 2002-07-19
  • 打赏
  • 举报
回复
DataSet我还没怎么用过,但是对于DataReader的话你是一定要在结束时close的,否则连编译都通不过。这也是ado.net的一个特点,就是每次操作都要连接,操作完了关闭,而不象以前可以一直保持连接。
lzh4481 2002-07-19
  • 打赏
  • 举报
回复

ADO.net有两种方法读数据:DataAdapter 和 DataReader

(以SqlClient为例)
1、DataApapter 可用于填充数据集(DataSet),适用于读取多个表里的大量数据.用此对象时,SqlConnection可以显示的打开、关闭,也可以隐示的打开和关闭。用法如下:

//创建SqlConnection对象
string strConn = "server=;dataBase=;uid=;pwd=;";
SqlConnection conn = new SqlConnection(strConn);
//创建SqlDataAdapter对象
string strSQL = "SQL statement";
SqlDataAdapter adapter = new SqlDataAdapter(strSQL,conn);
//创建并填充DataSet
DataSet ds = new DataSet();
adapter.Fill(ds);//在这里objConn自动Open,然后自动Close

填充多张表时:
conn.Open(); //在这里显示打开SqlConnection对象
adapter.SelectCommand = New SqlCommand(strSql1, conn);
adapter.SelectCommand.Parameters.Add("@TheYear", 1997);
adapter.SelectCommand.Parameters.Add("@TheQuantity", 30) ;
adapter.Fill(ds, "Orders");
adapter.SelectCommand = New SqlCommand(strSql2, conn) ;
adapter.Fill(ds, "Customers") ;
adapter.SelectCommand = New SqlCommand(strSql3, conn) ;
adapter.Fill(ds, "Employees") ;
conn.Close() ;//在这里显示关闭SqlConnection对象


2、DataReader相当于ADO里的RecordSet,适用于读取小量的数据,用此对象时必须显示的打开和关闭SqlConnection对象。加上错误处理后的用法如下:

SqlCommand comm = new SqlCommand(strSql,conn);
SqlDataReader reader;
conn.Open();//注意SqlConnection对象必须在try块的外面Open,否则会报错!!
try
{
reader = comm.ExecuteReader();
while(reader.Read())
{
//
}
}
catch(SqlException se)
{
//
}
finally
{
conn.Close();
}

DataAdapter的第二个例子也可以同样的加上错误处理,用法一样。


以上是我个人的理解,由不对的地方请高手指正!!

Hogwarts 2002-07-19
  • 打赏
  • 举报
回复
其实,connection的生命期多长也是需要具体情况具体分析的。如果过于频繁的new和close,会增加调用构造函数的开销,降低了程序的性能;但另一方面,如果connection一直不close不释放,虽然省去了构造函数的开销,但对于资源的占用太厉害,降低了SQL Server的性能。所以从提高综合性能考虑,最终总是根据具体情况进行调整,取一个折衷的做法的。


Hogwarts - S(u)ddenly dis@ppeared...
-
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
triout 2002-07-19
  • 打赏
  • 举报
回复
建议用完后就关闭。
bearbaba 2002-07-19
  • 打赏
  • 举报
回复
关掉,关掉,微软说的
pursuer 2002-07-19
  • 打赏
  • 举报
回复
那在什么时候创建SqlConnection对象比较好呢
//创建SqlConnection对象
string strConn = "server=;dataBase=;uid=;pwd=;";
SqlConnection conn = new SqlConnection(strConn);
是在每一个操作时创建一次
还是初始化时就创建好,然后让他上直保持这个状态!
两者有何不同
wangjingjing390 2002-07-18
  • 打赏
  • 举报
回复
ADO采用非连接的方法访问数据库,你每次执行一次select语句据把数据库的当前状态存于dataSet中,此后你就算一直保持连接也没有意义,还会抛出异常.所以我建议执行完操作就断开连接
bigrongshu 2002-07-18
  • 打赏
  • 举报
回复
每次都打开,然后执行操作,用完之后就关闭。
----------------------------
Try
---------------------
SqlConnection.Open()
----------
mySqlCommand.ExecuteReader()
.......
......
----------
或者
mySqlCommand.ExecuteNonQuery()
------------
catch
..........
finally

SqlConnection.Close()
end try
-----------------------------------------
-------------------------------
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧