【问题标题】:Multiple Trips to the Db多次前往 Db
【发布时间】:2011-08-18 14:54:37
【问题描述】:

我有这些复选框列表和中继器组(大约需要从我的数据库加载 8 个控件),对于每个控件,我的数据访问层中有一个方法来选择信息并将其返回给我的控件。

但是有一个页面,我需要同时加载所有这 8 个控件..所以每个方法都将是一次访问数据库,我知道这会影响性能。那么我可以有一个新方法来创建连接并打开它,然后我可以调用多个方法来访问数据库并加载信息,然后在最后关闭连接。

如果这 8 个连接对性能没问题,有什么想法吗?您如何看待这个想法以及如何将其应用到实际中?

【问题讨论】:

  • 一般来说,您假设建立一个到数据库的连接。根据需要拨打尽可能多的电话并在结束时断开连接。
  • 如何通过一次查询将所有结果检索到一个 DataSet 中
  • 我可能会误解或过度简化您的问题,但您看过formview control 吗?在使用数据库中的信息加载控件时,这对我非常有帮助。如果这不是您要找的,请忽略=)
  • 我实际上需要 8 个单独的列表,每个列表从单独的表中获取信息。

标签: c# asp.net sql


【解决方案1】:

除非您的应用将出现在高流量网站上,否则我不会担心它,直到它成为一个问题。如果出现问题,稍后返回并修复它相对简单,但老实说,这听起来像是过早优化的情况。

【讨论】:

  • -1 围绕数据库往返调用限制的智能设计不是过早的优化,而是良好的架构设计。一对和 8 之间是有区别的。这也是专门针对这种情况的 8,不包括是否有任何其他请求在幕后进行,例如 GetRoles()LogVisit() 等。
  • 你假设他的电话是数据密集型的,但如果你想投反对票,那就去吧
【解决方案2】:

如果您使用本机 SqlClient 访问您的数据库,使用完全相同的连接字符串,它们将共享一个连接池。 .默认情况下,在 ADO.NET 中启用连接池。除非您明确禁用它,否则池化程序会在您的应用程序中打开和关闭连接时对其进行优化。

所以根据你的问题,如果你这样做:

using (SqlConnection...)
{
 // all your data calls
}

或 7 个单独的调用,每次打开和关闭(或使用“使用”)正如@Tim Coker 提到的,性能上的任何差异都将是最小的

编辑:MSDN 上有一些过时的文章确实说“尽可能晚地打开连接并尽快关闭它”,因此您可以执行一系列快速的方法调用每个打开并快速关闭连接,但同样,无论如何都会共享同一个池。

【讨论】:

  • @Chris Marisic .. 很抱歉,感谢您提供帮助。但实际上,你所做的一切都是对试图提供帮助的人投反对票,最终让我感到困惑! ..而且我之前听说过一些关于连接池和拥有所有相同的 ConnectionString 的事情! ..如果您认为这些是错误的答案,请通过正确的答案而不是负分来证明!
  • @IKashef 你已经知道正确答案了,那就是改进你的应用程序设计。即使是 10 个并发用户,您也在谈论该单个页面连续 80 多次往返,不包括您的应用程序中的任何其他内容。被告知“已经足够好”是不正确的。
  • @Chris Marisic .. 好吧,我最初是在问如何改进我的设计以及如何使这种连接花费更少的时间,但具有良好的设计和架构.. 那么有什么想法吗? .. 改进总比说它已经足够好要好,他们没有编造事情,所以我认为 DownVoting 在这里是不公平的
【解决方案3】:

如果数据是只读的,你可以缓存它。

然后,每次访问数据库将只进行一次。

【讨论】:

  • 好吧,缓存对我没有好处。数据可能随时更改,我的前端将显示相同的旧缓存数据!
【解决方案4】:

打开和关闭连接时开销很小,因此您不必担心。

【讨论】:

  • 嗯,是的,也不是。实际上有很多开销,这就是为什么在大多数架构中自动实现连接池的原因。
猜你喜欢
  • 2023-03-27
  • 2015-04-02
  • 1970-01-01
  • 2011-01-21
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多