如果我在同一页面上有几个使用相同连接字符串的类,我应该保持连接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();
}
答案 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
}
这将确保您的连接正确关闭并处理掉。