【问题标题】:Is it acceptable to keep a db connection open for the life of the page?在页面的生命周期内保持数据库连接打开是否可以接受?
【发布时间】:2008-11-19 15:04:07
【问题描述】:

每个人都知道你应该在使用完连接后立即关闭它。

由于我的域对象模型设计存在缺陷,我不得不在整个页面生命周期中保持打开连接。本质上,我有一个 Just In Time 属性,它在第一次调用时打开一个连接,然后在 Page.Unload (..) 上它会检查一个 db 连接是否曾经打开,如果是则关闭它。由于只需要一秒钟,我认为它与立即关闭没有太大区别。

这样好吗?还是应该在每次使用后立即关闭?

提前致谢。

【问题讨论】:

  • 你的意思是回发之间的连接保持打开状态?
  • 否,db 连接在 Page.Load(...) 或更高版本中打开,然后在 Page.Unload(...) 事件中关闭。

标签: asp.net database-connection page-lifecycle


【解决方案1】:

不,不行。

如果您的应用程序需要扩展或扩展,您需要解决此问题。通过保持该连接打开,您正在降低扩展能力。请记住,打开的连接会占用服务器上的内存、客户端上的内存、保持打开的锁等。

【讨论】:

  • 感谢 Scott,这个特殊的应用永远不会超过 100 个用户。
【解决方案2】:

如果您的页面在到达 Page.Unload 事件之前就崩溃了怎么办?您将有一个打开的连接。对我来说,最好总是尽快关闭连接。

【讨论】:

    【解决方案3】:

    这并不理想,但我不会在上面重写我的应用程序。除非您的页面正在以各种方法进行大量耗时的工作,否则整个页面生命周期应该快速执行。实际上,这可能只是意味着您的连接对象的打开时间比原本打开的时间长了几毫秒。这在某些情况下可能很重要,但听起来不像您的情况。

    【讨论】:

    • Page.Load(..) 打开,Page.Unload(..) 关闭。
    • 纯粹主义者很像西点军校(美国陆军学院)的教官 - 当子弹开始飞行时,他们所说的大部分内容很快就被遗忘了。
    【解决方案4】:

    是的,没关系。

    尽快关闭连接是防止孤立打开连接的最佳做法,但如果您确定连接正在关闭,则没有任何问题。

    【讨论】:

    • 永远不要保持连接打开。该应用程序永远不会扩展,因为您将在不需要资源时使用它们。连接池是很久以前发明的东西。
    • 加油!这是一个真实的应用,有一个真实的问题,在一个真实的世界中,他说这个应用的用户增长永远不会超过 100 个。
    【解决方案5】:

    现在每个像样的 ASP.NET 应用程序都使用连接池,池基本上是一堆打开的连接。在您的情况下,这意味着您所持有的连接被“占用”并且不能用于服务其他请求。

    据我所知,这将是一个可扩展性问题,具体取决于您的页面需要完成工作/渲染的时间量。如果您希望只有 100 个用户,就像您说的那样,那么这可能不是问题 - 当然,除非它是 100 个请求/秒。

    从技术角度来看,没关系。据我所知,大多数客户端-服务器应用程序(Web 和非 Web),包括曾经这样工作的经典 ASP 代码,例如,您为整个页面声明一个连接并使用它。

    【讨论】:

      【解决方案6】:

      页面崩溃?这就是 using 和 finally 的用途

      也就是说,为了数据库性能(即扩展)*,最好让连接打开的时间尽可能短,只允许您不想打开关闭打开关闭打开关闭以实现快速顺序和可预测的工作

      * 在我职业生涯的早期,一位导师告诉我这个,我必须说我自己并没有实际测试过,但理论上听起来是对的

      【讨论】:

      • 连接池将有助于您打开和关闭许多连接的情况。
      • 我认为 John 的问题在于,他的架构无论出于何种原因都无法使用 using/finally,因为 open 在 PageLoad 和 PageUnload 中。
      • 但我会说这是一个基本的设计问题 - 它与尽可能短的连接持续时间相矛盾
      【解决方案7】:

      当然,您可以让它们保持打开状态,但不能。在 finally 块中使用后关闭它。 “每次使用后”的公平权衡是在每次使用后关闭它,如果您倾向于运行存储过程,更新列,然后删除其他行,您可以围绕这三个打开/关闭操作,假设它们都包含在 try/catch/finally 中。

      【讨论】:

      • “假设它们都包含在 try/catch/finally 中”——或者更有可能并且可能更好的是 try/finally 或 using 语句。
      【解决方案8】:

      如果您在页面的整个生命周期内执行多个查询,您当然应该保持连接打开。通常,实际上,人们会在许多页面上重复使用连接。

      【讨论】:

        【解决方案9】:

        我认为一个更好的问题是提供更明智和更有成效的反馈,可能会提供一些关于您正在做什么(代码)的 sn-ps,并扩展您做出此选择的原因。很可能有一个更好的解决方案,不需要保持连接打开这么长时间,但至少,出于务实的原因,您可以获得一些关于是否值得改进的反馈。

        将来,您肯定希望摆脱代码隐藏中的数据访问。

        【讨论】:

          【解决方案10】:

          我发现在使用 ORM (Open Session in View) 时保持连接打开很方便,这样在初始急切获取后,可以根据需要延迟加载其他数据。当页面响应时间合理以免占用连接时,这很有效。

          【讨论】:

            猜你喜欢
            • 2019-04-16
            • 1970-01-01
            • 1970-01-01
            • 2021-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-10
            相关资源
            最近更新 更多