SqlConnection和Pool,保持着一个开放的连接kung-foo或foo-bar
本文关键字:一个 连接 foo-bar kung-foo Pool SqlConnection | 更新日期: 2023-09-27 18:30:10
我原以为自己很聪明。但鉴于最近的发现,我不再那么确定了。在页面生命周期中,可能存在任意数量的数据库交互。有的背靠背,有的散开。因此,我发明了一个对象,使HttpContext.Items字典中的SQL连接实例保持活动状态。然后,每个db请求都使用这个连接,当http请求结束时,我会正确地处理这个连接。我们看到的是,连接将在几百毫秒内打开,并且由于一些繁重的http缓存,可用连接不足并不令人担忧。
重点是防止由于建立新的连接而导致的额外往返。但是,当我偶然发现连接池的知识时,我认为这相当于否定了保留SqlConnection的有用性。还是这样?
就性能而言,方案A与方案B相同吗?你推荐哪一个?场景B是否没有提供任何性能提升,甚至可能因为某些边缘情况下连接可能没有得到正确处理而阻碍它?请原谅这些例子中的伪性,我不想把它们弄得一团糟。
A
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand("...", connection))
{
... doing database stuff ...
}
}
... traversing the stack ...
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand("...", connection))
{
... doing database stuff ...
}
}
B
var connectionKeeper = new ConnectionKeeper();
// Add to the context items so it can be used anywhere
Context.Items.Add("Connection", connectionKeeper);
... traversing the stack ...
using (var command = new SqlCommand("...", connectionKeeper.Connection))
{
... doing database stuff
}
... traversing the stack ...
using (var command = new SqlCommand("...", connectionKeeper.Connection))
{
... doing database stuff
}
... traversing the stack ...
// The end of the request
sqlKeeper.Dispose();
使用A部分中的代码。请让连接池来完成它的工作。不惜一切代价避免保持一个静态的SqlConnection
。连接池就是为此而设计的。
这里有一篇MSDN文章供您参考。
SQL Server连接池(ADO.NET)
除非关闭连接池,否则在代码中这样做毫无意义。
在这样做之前,你应该认真思考,这是极端的情况。
连接池的发明是为了解决您试图通过这种"永久"连接解决的情况,因此它实际上会干扰内置的优化,并增加代码的数量、复杂性和脆弱性。