C# 应用程序中的SQL连接应该如何调用?

C# 应用程序中的SQL连接应该如何调用?,c#,asp.net,sql,C#,Asp.net,Sql,回到基本点 我有一个用c#编写的应用程序,我正在使用sqlClient连接到数据库 我有几种方法,通常在try-catch块中打开连接 try{ **open connection** //Mehod1() //Method2() ........ }catch(exception){ //Do something }finally{ **close connection** } 问题是池中有很多连接。 我使用母版页,在母版页中,我从数据库加载菜单(每

回到基本点

我有一个用c#编写的应用程序,我正在使用sqlClient连接到数据库

我有几种方法,通常在try-catch块中打开连接

try{
    **open connection**
   //Mehod1()
   //Method2()
   ........
 }catch(exception){
   //Do something
 }finally{
  **close connection**
 }
问题是池中有很多连接。

我使用母版页,在母版页中,我从数据库加载菜单(每个用户的菜单不同)

然后在主页中,我再次打开一个连接以获取其余数据

在页面中间,它可能是一个需要再次连接到数据库的方法

我的问题是

这是个好习惯吗

我做错什么了吗

是否有更好的方法避免多重连接? 那么单例模式呢

提前谢谢

解决方案

我找到了原因

我忘了关闭一个连接

我确信我已经把它关了,但是 有时候你不能这么肯定


感谢大家的回复

可能您没有处理SqlConnections 试试这个:

using (SqlConnection connection = new SqlConnection(connectionString))
{ }
此语法将自动为您调用方法
Dispose()

更新:

有关此方法的更多信息,请参见:

基本上,区别在于方法
Dispose()
调用方法
Close()
,但在清理一些资源和从池中删除连接之前


正如您所看到的那样,
Dispose()
Close()
做得更多。因此,如果以后要重用连接,请使用方法
Close()
,如果不完全销毁,请使用方法
Dispose()
,如果使用上述语法,该方法将自动被调用。

由于连接是池连接,因此不需要在不同的方法中“重用”它

我使用以下代码:

using(SqlConnection connection = new SqlConnection("your-connectionstring"))
{
  // Do your stuff here...
}
使用
只是一种简捷的书写方式
最后尝试catch
。它用于一次性物品

这可以应用到每种方法中

编辑:使用池中的连接也不会影响性能。所有连接信息都会被缓存。所以只需在原子级别上使用SqlConnection

不过,以更通用的方式处理ConenctionString是一件好事…

如上所述,使用()可以为实现IDisposable的类新建一个新对象。但既然如此,一旦你完成了,你就不能让你的连接打开。池中的连接数量有限,如果未关闭连接,则会导致其他SPID无法使用,而这些SPID正在等待活动连接,最终将超时。所以你应该

  • 始终有原子事务和小事务
  • 完成后关闭
  • Microsoft Enterprise Library中有一个DAAB(数据访问应用程序块),它可以用作打开和关闭连接的助手,并且可以轻松地执行许多其他与数据库相关的任务。给你

    连接池是一件“好”事情。池中有多少个连接?连接池通常是一件好事,因为它允许您高效地“打开/关闭”多个连接。在web应用程序中,数据库连接的单例是一件坏事——应该利用连接池,而不是利用连接池。每次都会创建一个新的连接。“每次都会创建一个新的连接。”您如何衡量?我有一个sql脚本来观察连接dispose和close之间的池有什么不同吗?我同意您的看法,但我不知道为什么没有从池中重用连接。它每次都会创建一个新的。如果我打开一个连接,那么我在池中有一个连接,当我需要一个连接时,我将从池中获取它。但在我的例子中,它在池中又创建了一个连接。这是正常的行为吗?你可能会在这里得到更多的答案。如果连接字符串100%相同,则连接必须来自同一池。谢谢您的回答。最后,我认为使用using比try catch block更好,因为很容易忘记关闭任何连接。我会按照你的建议检查DAAB的。