每个人都知道您应该在使用完连接后立即关闭它。
由于我的域对象模型设计存在缺陷,我不得不在整个页面生命周期中保持连接打开。本质上,我有一个 Just In Time 属性,它在第一次调用时打开一个连接,然后在 Page.Unload (..) 上它会检查一个 db 连接是否曾经打开,如果是则关闭它。由于只需要一秒钟,我认为它与立即关闭它并没有太大不同。
这个可以吗?还是应该在每次使用后立即关闭?
提前致谢。
每个人都知道您应该在使用完连接后立即关闭它。
由于我的域对象模型设计存在缺陷,我不得不在整个页面生命周期中保持连接打开。本质上,我有一个 Just In Time 属性,它在第一次调用时打开一个连接,然后在 Page.Unload (..) 上它会检查一个 db 连接是否曾经打开,如果是则关闭它。由于只需要一秒钟,我认为它与立即关闭它并没有太大不同。
这个可以吗?还是应该在每次使用后立即关闭?
提前致谢。
不,这样不行。
如果您的应用程序需要增长或扩展,您将需要解决此问题。通过保持该连接打开,您正在降低扩展能力。请记住,打开的连接会占用服务器上的内存、客户端上的内存、保持打开的锁等。
如果在到达 Page.Unload 事件之前页面崩溃了怎么办?您将有一个打开的连接。对我来说,最好总是尽快关闭连接。
是的,没关系。
尽快关闭连接是防止孤立打开连接的最佳做法,但如果您确定连接正在关闭,那没有任何问题。
现在每个像样的 ASP.NET 应用程序都使用连接池,而池基本上是一堆打开的连接。在您的情况下,这意味着您所持有的连接被“占用”并且不能用于服务其他请求。
据我所知,这将是一个可扩展性问题,具体取决于您的页面需要完成工作/渲染的时间量。如果您希望只有 100 个用户,就像您说的那样,那么这可能不是问题 - 当然,除非它是 100 个请求/秒。
从技术的角度来看是可以的。据我所知,大多数客户端-服务器应用程序(Web 和非 Web),包括曾经这样工作的经典 ASP 代码,例如,您为整个页面声明一个连接并使用它。
这并不理想,但我不会重写我的应用程序。除非您的页面正在以各种方法进行大量耗时的工作,否则整个页面生命周期应该快速执行。实际上,这可能只是意味着您的连接对象的打开时间比原本打开的时间长了几毫秒。这在某些情况下可能很重要,但听起来不像你的情况。
页面崩溃?这就是 using 和 finally 的用途
也就是说,为了数据库性能(即扩展)*,最好保持连接打开的时间尽可能短,只允许您不想打开关闭打开关闭打开关闭以实现快速顺序和可预测的工作
* 在我职业生涯的早期,一位导师告诉我,我必须说我自己并没有实际测试过,但理论上听起来是正确的
当然,您可以让它们保持打开状态,但不行不行。在 finally 块中使用后关闭它。“每次使用后”的公平权衡是在每次使用后关闭它,如果您倾向于运行存储过程,更新列,然后删除其他行,您可以围绕这三个打开/关闭操作,假设它们都包含在 try/catch/finally 中。
如果您在页面的整个生命周期中执行多个查询,那么您当然应该在页面的整个生命周期内保持连接打开。通常,实际上,一个人在许多页面上重复使用连接。
我认为一个更好的问题是提供更明智和更有成效的反馈,可能会提供一些你正在做的事情(代码)的片段,并扩展你做出这个选择的原因。很可能有一个更好的解决方案,不需要保持连接打开这么长时间,但至少,出于务实的原因,您可以获得一些关于它是否值得改进的反馈。
将来,您肯定希望摆脱代码隐藏中的数据访问。
我发现在使用 ORM(在视图中打开会话)时保持连接打开很方便,这样在初始渴望获取之后,可以根据需要延迟加载其他数据。当页面响应时间合理以免占用连接时,这很有效。