2012-02-01 26 views
0

在我的页面代码隐藏中,我有一个类级别的延迟加载的连接属性,它在引用时实例化并打开。使用后我从不关闭连接。而是在页面卸载事件期间关闭它。这消除了每当我完成它时关闭它所需的额外代码。到目前为止,它似乎工作,但我有兴趣听到这样做的任何可能的负面影响。在页面/控件的Unload事件上关闭类级数据库连接是个好主意吗?

这里是什么样子:

Dim _DbConnection As MyConnection 
Private ReadOnly Property DbConnection As MyConnection 
    Get 
     If _DbConnection Is Nothing Then _DbConnection = GetNewConnection() 
     Return _DbConnection 
    End Get 
End Property 

Private Sub Page_Unload(sender As Object, e As System.EventArgs) Handles Me.Unload 
    CloseConnection(DbConnectionConnection) 
End Sub 

编辑:我欣赏的答案,建议这是一个坏主意,但是什么做我的方式的负面影响?如果这不是一个好主意,那么为什么会有一个合理的理由。

+0

看到我的更新答案 – 2012-02-01 14:19:43

回答

1

“我在使用后永远不会关闭连接”这是个可怕的主意。您可以使用使用块来确保正确解析资源。

这是我的建议。

using (SqlConnection conn = new SqlConnection(strconString)) 
    { 
    // do some logic 
    } 
+0

到那个最好,我的意思是我在完成使用后不会立即关闭它(通常在同一个块或方法中)。相反,它总是在页面卸载事件中关闭。唯一可以预见的问题是,在卸载事件期间关闭而不是立即关闭时,它会保持打开几秒钟,但最终会关闭。另外,我也可以在Unload事件上调用连接的.Dispose方法,我可以吗? – oscilatingcretin 2012-02-01 13:06:29

+0

@ scilatingcretin 对于您提到的问题,您应该使用[使用](http://msdn.microsoft.com/zh-cn/library/yh598w02%28v=vs.80%29.aspx)。对象一旦超出范围就会被处置。 – 2012-02-01 13:30:33

+0

我同意使用声明,但我真正感兴趣的是以我在Unload事件上的方式关闭它的负面影响。只要连接最终每次都关闭,这似乎就是合法的。 – oscilatingcretin 2012-02-01 13:47:45

1

我拉维认为这是一个坏主意。更好的做法是在完成每个查询后始终关闭数据库连接,并且应该使用连接池来提高性能。

http://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.100%29.aspx

我认为这是一个坏主意,因为它使一个不太明显的代码,后来可能会导致错误。如果另一位开发人员查看代码,他就不会明白连接是如何关闭的,因此他可能会进行修改以引入错误。你希望你的代码可读和明显。使用页面生命周期技巧来节省几毫秒只会导致问题的发展。

+0

好吧,让我们假设它是如何处理连接的。我在这里寻找的是客观的可测量的影响,这可能会对系统产生影响,或者它会如何引入直接的并发症。一名开发者因为对我的代码的误解而走进我的脑海中,写出错误的代码更加主观,因为它取决于开发人员通过不同级别的文档理解代码的能力。 – oscilatingcretin 2012-02-01 14:29:33

+0

最佳做法是打开和关闭连接,尽量接近尽可能使用它的实际查询。我认为更好的问题是:使用最佳实践对系统可能产生的客观可衡量的影响是什么?偏离最佳实践的是什么? – 2012-02-01 14:37:13

0

请参阅this

如从那里引述:

在对照,使用此事件为特定控制做最终清理,如关闭控制专用数据库连接 。

对于页面本身,请使用此事件进行最终清理工作,例如关闭打开文件和数据库连接的 ,或者完成日志记录 或其他请求特定的任务。

我的建议是避免卸载事件。如有可能,尽早做清理代码,如果可以的话,请使用“使用”。在某种程度上,这就像使用“全局”变量,而不是一个局部变量之间的选择,后者是

或者替代(用System.Data.CommandBehavior.CloseConnection

string sConnString = "Server=localhost;Database=Northwind;Integrated Security=True"; 
string sSql = "SELECT CategoryID, CategoryName FROM Categories ORDER BY CategoryName"; 
SqlConnection cn = new SqlConnection(sConnString); 
SqlCommand cmd = new SqlCommand(sSql, cn); 
cn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
rdr.Read(); 
//execute 
rdr.Close();//closing reader closing connection 
相关问题