保持连接字符串开启还是关闭 c#

4

如果在同一页上有几个使用相同连接字符串的类,我是应该保持连接open();还是每次打开和关闭。

以下是示例:

protected void Page_Load(object sender, EventArgs e)
{
    cs.Open();
    something ...
    cs.Close();    
}

protected void Button1_Click(object sender, EventArgs e)
{

    cs.Open();
    something .....
    cs.Close();
}

或者这个

protected void Page_Load(object sender, EventArgs e)
{
    cs.Open();
    something ...
}

protected void Button1_Click(object sender, EventArgs e)
{
    something .....
    cs.Close();
    cs.Dispose();
}
5个回答

12

对于.NET,所有非托管资源(例如数据库连接)的一般规则是应该尽可能打开并尽可能关闭,因此你展示的第一个选项是正确的。

.NET提供了连接池,确保您不会打开更多的连接超过需要,因此当您调用Open或Close时,连接并不会立即打开或关闭。相反,连接池管理所有连接,以保持与数据库通信的开放和关闭的健康比例。

除非您有其他需要保持连接打开的情况,例如在事务内部。


5

首先,我建议使用带有连接和线程池的抽象化方法来完成这项任务。ADO.NET、Entity Framework、NHibernate等...

其次,绝对不要将数据访问代码放入页面控制器中。

在实际操作中,

始终将关闭语句放入finally块中,以便无论抛出什么异常都会被调用。


4

当连接不再使用时,始终关闭连接,然后在需要时重新打开连接。示例:

Connection.Open();
Command.ExecuteNonQuery();
Connection.Close();
每次执行查询操作时,您应该重新打开连接。

1
尽可能晚地打开数据库连接,并尽早关闭它。此外,您应确保始终关闭连接。请注意,这意味着不仅仅编写代码connection.Close()。如果在处理连接时抛出异常,则永远不会触发Close语句,您的连接将保持打开状态。 在处理非托管资源时,请尝试使用using语句:
using (var connection = new SqlConnection(...))
{
  connection.Open();
  // do some processing
}
这将确保您的连接被正确关闭和处理。

1
是的,完成后应释放资源,并且只在最短时间内打开它们。当您打开连接时,池首先被使用,因此这不会太昂贵。只需确保您正在使用连接池。此外,请查看using构造函数
using(var cn = new SqlConnection(...)){
 //perform db work
}

当你完成时,这将调用dispose。任何实现IDisposable接口的类都可以在Using语句中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,