保持连接字符串打开或不打开c#

时间:2013-11-26 20:48:24

标签: c# connection-string

如果我在同一页面上有几个使用相同连接字符串的类,我应该保持连接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 个答案:

答案 0 :(得分:12)

作为.NET的一般规则,所有非托管资源(如数据库连接)应尽可能晚地打开,并尽早关闭 ,以便第一个选项你展示的是正确的方法。

.NET提供了一个连接池,确保您不会打开比所需更多的连接,因此当您调用Open或Close时不会立即发生这种情况。但相反,池管理所有连接,以保持与数据库的开放和结束通信之间的健康比。

当然,除非您有其他情况需要保持连接打开,例如当您在交易中时。

答案 1 :(得分:5)

首先,我建议使用一个抽象,通过连接和线程池为您完成此操作。 ADO.NET,实体框架,NHibernate等......

其次,永远......永远.....永远......将您的数据访问代码放入您的页面控制器。

更实际的说明,

始终将close语句放入finally块中,这样无论抛出什么异常,都会始终调用它。

答案 2 :(得分:4)

在不再使用连接时始终关闭连接,然后在需要时再次打开连接。例如:

Connection.Open();
Command.ExecuteNonQuery();
Connection.Close();

每次运行查询时,都应重新打开连接

答案 3 :(得分:1)

是的,您应该在完成后释放资源,并且只在最短的时间内打开。当您打开连接时,首先使用池,因此这不是那么昂贵。只需确保您使用connection pooling

另外,请查看using construct ..

using(var cn = new SqlConnection(...)){
 //perform db work
}

完成后会调用dispose。任何实现IDisposable接口的类都可以在Using语句中使用。

答案 4 :(得分:1)

尽可能晚地打开与数据库的连接,并尽早关闭它。在此之后,您应确保始终关闭连接。请注意,这不仅仅意味着编写代码connection.Close()。如果在处理连接时抛出异常,则Close语句将永远不会被命中,并且您的连接将保持打开状态。

在处理非托管资源时尝试使用using语句:

using (var connection = new SqlConnection(...))
{
  connection.Open();
  // do some processing
}

这将确保您的连接正确关闭并处理掉。