首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET中的SqlConnection --如何最好地利用连接池?

.NET中的SqlConnection --如何最好地利用连接池?
EN

Stack Overflow用户
提问于 2009-06-27 05:10:47
回答 3查看 1.4K关注 0票数 2

我读到.NET使用连接池。

例如,如果我使用相同的连接字符串实例化一组SqlConnection对象,那么在内部.NET将知道使用相同的连接。

这是正确的吗?

此外,在基于web的大型应用程序中,有没有什么最好的方法来驾驭这种“力量”呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-27 05:16:46

在Web应用程序和SQL Server之间设置TCP连接可能是一项开销很大的操作。连接池允许在后续数据请求中重用到数据库的连接。只有当连接池中没有可用的连接时,才会建立新的连接,而不是为每个请求建立新的TCP连接。当连接关闭时,它将返回到保持与数据库连接的池中,而不是完全断开该TCP连接。

当你完成连接时,一定要关闭它们。无论任何人对微软.NET框架中的垃圾回收有何评论,当您完成连接时,请始终显式地调用Close或Dispose。不要相信公共语言运行库(CLR)会为您清理和关闭连接。CLR最终将销毁该类并强制关闭连接,但您无法保证对象上的垃圾回收何时会实际发生。

要以最佳方式使用连接池,有几条规则可以遵循。首先,打开连接,完成工作,然后关闭连接。如果有必要,可以在每个请求上多次打开和关闭连接,而不是保持连接打开并通过不同的方法传递它。其次,使用相同的连接字符串(如果使用集成身份验证,则使用相同的线程标识)。如果不使用相同的连接字符串,例如根据登录的用户自定义连接字符串,则不会获得连接池提供的相同优化值。如果您在模拟大量用户时使用集成身份验证,那么您的池化效率也会大大降低。

在尝试跟踪与连接池相关的任何性能问题时,.NET CLR数据性能计数器可能非常有用。

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

票数 13
EN

Stack Overflow用户

发布于 2009-06-27 06:41:27

如果使用以下语法,则无论何时离开using块,都将调用dispose方法,即使发生异常也是如此。

代码语言:javascript
复制
using(SqlConnection connection = new SqlConnection())
{
    // Work with connection object here.
}

//connection object gets disposed here.
票数 9
EN

Stack Overflow用户

发布于 2009-06-27 05:25:11

我不确定这是否完全相关,但我刚刚接管了一个项目,并注意到最初的编程团队没有做一些非常重要的事情。

当你有一个SQLConnection的时候,我们把它叫做conn,然后你这样做:

代码语言:javascript
复制
conn.Open();

然后执行一些SQL语句,可以是select、insert或update语句。它完全有可能失败。所以,当然,你应该这样做:

代码语言:javascript
复制
try { conn.Open() } 
catch (SqlException ex) 
 { 
       //do your logging/exception handling 
 }

但是,人们忘记添加Finally块。

代码语言:javascript
复制
finally {
       if (conn.State == System.Data.ConnectionState.Open)
         conn.Close();
}

您希望确保在出现异常时,连接不会保持打开状态,因此请确保将其关闭。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1052149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档