4

我曾以为我很聪明。但鉴于最近的发现,我不再那么确定了。在页面生命周期中,可能有任意数量的数据库交互。有的背靠背,有的散开。所以我发明了一个对象,它可以在 HttpContext.Items 字典中保持 SQL 连接的实例处于活动状态。然后每个 db 请求都使用此连接,当 http 请求结束时,我会正确处理连接。我们正在查看连接将在几百毫秒内打开,并且在一些繁重的 http 缓存中,可用连接用完并不是一个问题。

关键是要防止由于建立新连接而产生额外的往返行程。但是当我偶然发现连接池的知识时,我认为它使保留 SqlConnection 的用处完全无效。或者是吗?

场景 A 是否与场景 B 相同,性能方面?你会推荐哪个?场景 B 是否没有提供性能提升,甚至可能因为连接可能无法正确处理的某些极端情况而阻碍它?原谅示例中的伪性,我不想将它们与 barf 混淆。

一个

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 ...
   }
}

   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();
4

2 回答 2

7

使用 A 部分中的代码。请让连接池完成它的工作。SqlConnection不惜一切代价避免保持静电。连接池就是为此而设计的。

这是一篇 MSDN 文章供您参考。

SQL Server 连接池 (ADO.NET)

于 2012-04-06T16:25:04.320 回答
2

除非您关闭连接池,否则在代码中这样做是没有意义的。

在这样做之前你应该认真考虑一下,这是极端情况。

连接池的发明是为了解决您试图通过这种“永久”连接解决的情况,因此它实际上会干扰内置优化并增加代码的数量、复杂性和脆弱性。

于 2012-04-06T16:36:46.357 回答