我读到.NET使用连接池。
例如,如果我使用相同的连接字符串实例化一组SqlConnection对象,那么在内部.NET将知道使用相同的连接。
这是正确的吗?
此外,在基于web的大型应用程序中,有没有什么最好的方法来驾驭这种“力量”呢?
发布于 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
发布于 2009-06-27 06:41:27
如果使用以下语法,则无论何时离开using块,都将调用dispose方法,即使发生异常也是如此。
using(SqlConnection connection = new SqlConnection())
{
// Work with connection object here.
}
//connection object gets disposed here.发布于 2009-06-27 05:25:11
我不确定这是否完全相关,但我刚刚接管了一个项目,并注意到最初的编程团队没有做一些非常重要的事情。
当你有一个SQLConnection的时候,我们把它叫做conn,然后你这样做:
conn.Open();然后执行一些SQL语句,可以是select、insert或update语句。它完全有可能失败。所以,当然,你应该这样做:
try { conn.Open() }
catch (SqlException ex)
{
//do your logging/exception handling
}但是,人们忘记添加Finally块。
finally {
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
}您希望确保在出现异常时,连接不会保持打开状态,因此请确保将其关闭。
https://stackoverflow.com/questions/1052149
复制相似问题