3

我目前使用 ASP.NET 创建一个 webportal,它严重依赖于数据库的使用。基本上,来自任何用户的每个(以及几乎每个 :P )GET 查询都会导致来自网络服务器的对数据库的查询。

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

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

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

我已经尝试在这里和网络上到处搜索以找到一些关于此的最佳实践,但没有运气。我得到的最接近的是:长时间保持数据库连接打开是否安全,但这似乎更适合您拥有多个数据库用户的分布式系统,而我只有我的网络服务器..

4

9 回答 9

8

您担心性能还为时过早。

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

就像是...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}
于 2009-03-04T15:23:19.143 回答
3

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

于 2009-03-04T15:23:05.963 回答
1

完成数据库交互后,您应该始终关闭连接。ADO.NET 具有连接池,它将负责有效的连接重用。每当您打开第二个、第三个和后续连接时,它们都会从池中取出,几乎没有开销。

希望这可以帮助。

于 2009-03-04T15:23:52.047 回答
1

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

如果它是一个门户,您有公共内容和用户特定内容,则使用缓存您可以存储公共项目以及使用损坏的键(使用用户 ID)您可以存储用户特定项目。

于 2009-03-04T15:27:49.197 回答
0

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

于 2009-03-04T15:23:56.677 回答
0

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

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

于 2009-03-04T15:24:11.857 回答
0

你最初的预感是正确的。您需要的是数据库连接池。

于 2009-03-04T15:24:26.070 回答
0

我不知道您的平台,但请查看连接池 - 必须有一个可用的库或实用程序(在基本系统中或作为附加组件,或与数据库驱动程序一起提供),它将提供汇集多个到数据库的活动连接,当您从池中获得一个时,这些连接已准备好并准备好使用。

老实说,我希望池在任何数据库抽象库中默认发生(有一个可用的选项来禁用它)。ADO.NET 似乎做到了这一点。

于 2009-03-04T15:25:23.773 回答
-2

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

但总的来说,是的,拥有一个打开的连接并保持一段时间比每次都重新打开一个数据库连接更聪明。根据连接类型、网络问题和月相,初始连接可能需要一秒钟或更长时间;如果您的工作量是这样的,您期望每五秒左右一次 GET 多于一次,那么您会更高兴与常设连接。

于 2009-03-04T15:25:58.810 回答