打开数据库连接一次或每个数据库操作?

时间:2009-03-04 15:19:02

标签: database ado.net web sqlconnection

我目前正在创建一个使用ASP.NET的Webportal,它在很大程度上依赖于数据库的使用。基本上,来自任何用户的每个(几乎每个:P)GET查询都将导致从网络服务器查询数据库。

现在,我对此非常陌生,而且我非常关注性能。由于我在这方面缺乏经验,我真的不知道会发生什么。

我的问题是,使用ADO.NET,只是将静态连接从Web服务器打开到数据库,然后在每次查询数据库之前检查此连接服务器端的完整性,这是一个更明智的选择吗? - 或者,我最好在每次查询之前打开连接然后关闭它?

在我的脑海中,第一个选项会更好,因为您在每个查询之前节省了时间握手等,并且您在数据库和服务器端都节省了内存,因为您只有一个连接,但这种方法是否有任何缺陷? 2个查询是否可以同时发送可能会破坏彼此的完整性或混合返回的数据集?

我已经尝试在这里和网上搜索,找到一些关于此的最佳实践,但没有运气。我得到的最近的是:is it safe to keep database connections open for long time,但这似乎更适合于你有多个数据库用户的分布式系统,而我只有我的网络服务器..

9 个答案:

答案 0 :(得分:8)

你很早就担心表现了。

无论如何,框架汇集了连接。你应该打开它们,使用它们,并尽快处理它们。

像...一样的东西。

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

答案 1 :(得分:3)

最好让ADO.NET处理连接池。如果它认为需要连接,它将保持连接,但不使用静态连接对象。那只是闻起来。最好将连接对象传递给需要它的方法,并在using块中创建连接。

答案 2 :(得分:1)

完成数据库交互后,应始终关闭连接。 ADO.NET具有连接池,可以有效地重用连接。每当你打开第二个,第三个和第二个连接时 - 它们将从一个几乎没有开销的池中被带走。

希望这有帮助。

答案 3 :(得分:1)

我会考虑更多关于缓存而不是高级连接池。每次获取都需要数据库命中?

如果它是一个门户网站,你有共同的内容和用户特定的内容,使用缓存你可以存储公共项目以及一个受损的密钥(用户ID),你可以存储用户特定的项目。

答案 4 :(得分:0)

ADO.NET执行连接池。当您在连接对象上调用close时,它将保持池中的连接,从而使下一个连接更快。

答案 5 :(得分:0)

您绝对不希望为每个数据库调用打开连接,这将导致非常快的性能极差。建立数据库连接非常昂贵。

相反,您应该使用的是连接池。池将管理您的连接,并尽可能尝试重用现有连接。

答案 6 :(得分:0)

您最初的预感是正确的。你需要的是database connection pooling.

答案 7 :(得分:0)

我不知道你的平台,但是看看连接池 - 必须有一个库或实用程序(在基本系统中或作为附加组件,或随数据库驱动程序提供)将提供手段将几个活动连接池连接到数据库,这些连接已准备就绪,并且当您从池中获取时,可以使用它们。

说实话,我希望默认情况下在任何数据库抽象库中都会出现池(有一个可用的选项来禁用它)。似乎ADO.NET就是这样做的。

答案 8 :(得分:-2)

真的要问的第一个问题是为什么你是否非常关注性能?你的预期工作量是多少?你试过了吗?

但总的来说,是的,拥有一个开放的连接,你可以保持一段时间,而不是每次重新打开一个数据库连接;根据连接的类型,网络问题和月球的相位,可能需要很长一段时间才能建立初始连接;如果你的工作量是这样的,你每隔五秒左右就会得到超过一个GET,那么你就会对站立连接感到满意。