当前位置: 首页 > 面试题库 >

SqlConnection和Pool是否保持打开的连接kung-foo或foo-bar?

龙承颜
2023-03-14
问题内容

我以为我很聪明。但是鉴于最近的发现,我不确定。在页面生命周期中,可能有许多数据库交互。有些背靠背,有些则散布开来。因此,我发明了一个对象,该对象在HttpContext.Items字典中使SQL连接的实例保持活动状态。然后,每个数据库请求都使用此连接,并且当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();

问题答案:

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

这是MSDN文章,供您参考。

SQL Server连接池(ADO.NET)



 类似资料:
  • 问题内容: 在Java中,这两个函数声明之间有什么区别? 在这里,您可以找到该问题的答案,但仅适用于 C / C ++ 。在这些语言中,两种声明样式的存在是完全有意义的。 但是在 Java 中这有什么意义呢? 问题答案: 后者在Java中是非法的。您不能声明这样的方法。您应该得到这样的错误: 因此,不仅没有意义-您根本找不到尝试使用此样式的有效代码。

  • 问题内容: 请考虑以下两个函数定义: 两者之间有什么区别吗?如果没有,那为什么会有void争论呢?审美原因? 问题答案: 在C中: 表示“带有未指定类型的未指定数量的参数的函数” 表示不带参数的函数” 在C ++中: 表示“foo不带参数的函数” 表示“foo不带参数的函数” 因此,通过编写,我们可以在两种语言中实现相同的解释,并使标头变为多语言(尽管我们通常需要对标头做更多的事情才能使它们真正成

  • 问题内容: 我看到其他地方说: 等于 我测试了一下,他们确实做了同样的事情。但为什么?到底是什么? 问题答案: AND和OR运算符都可以捷径。 因此,仅在第一个表达式为true时才尝试第二个表达式(更确切地说,是类似事实的表达式)。第二个操作确实起作用(无论其内容如何)的事实无关紧要,因为除非第一个表达式的计算结果为真,否则它不会执行。如果是事实,则将执行它以尝试第二次测试。 相反,如果语句中的第

  • 问题内容: 早在2016年11月,我发布了一个问题,询问为什么我不能使用Guard创建与变量名称相同的未包装版本的变量,就像让let那样: 链接: 为什么后卫不让foo = foo有效? 当我编写该问题时,以下代码将无法编译,并显示“定义与先前值冲突”的错误: 但是,我只是在工作中发现了一些可以做到这一点的代码,现在它可以毫无抱怨地进行编译,并且可以完成我想要的工作!运行时,print语句显示fo

  • 我遇到了这个问题:对于Vaadin7,我已经配置了我的持久性。xml,下面是代码 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version=“2.0” 当我创建一个新的JPA容器并将其绑定到一个表时,我会在MSSQL活动监视器上看到我的新连接,但如果会话超时或注销,我仍然会在SQL上看到连接。 如果我在应用程序中重新登录,

  • 问题内容: Foo具有: 和酒吧有: 除了表被称为foo_bar还是bar_foo之外,mappedBy属性的位置对双向关系有何影响?没有mapByBy属性,我得到两个联接表,即foo_bar和bar_foo。 问题答案: 该文档说: 如果关联是双向的,则一侧必须是所有者,而一侧必须是反向端(即,在更新关联表中的关系值时,它将被忽略): 因此,具有属性的一面是反面。没有属性的一方是所有者。 所有者