在页面生命周期内保持数据库连接打开是否可以接受?

时间:2008-11-19 15:04:07

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

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

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

这可以吗?或者它应该在每次使用后立即关闭吗?

提前致谢。

10 个答案:

答案 0 :(得分:7)

不,不行。

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

是的,没关系。

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

答案 3 :(得分:2)

现在每个体面的ASP.NET应用程序都使用连接池,而池基本上是一堆打开的连接。在你的情况下,这意味着你所持有的连接被“占用”,不能用于提供其他请求。

据我所知,这将是一个可伸缩性问题,具体取决于您的页面需要执行工作/渲染的时间。如果您只想要100个用户,那么可能不是问题 - 除非它当然是100 req / sec。

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

答案 4 :(得分:1)

页面崩溃了吗?

是使用和最终的用途

表示,为了DB性能(即缩放)*,最好保持连接打开尽可能短的时间段,只允许您不希望打开近距离打开关闭以实现快速顺序和可预测的工作

*在我的职业生涯早期,我被一名导师告知过这一点,我必须说我自己并没有亲自测试过,但理论上听起来不错

答案 5 :(得分:1)

当然你可以让它们保持开放,但不是没有。在finally块中使用后关闭它。从“每次使用后”的公平交易是在每个使用块之后关闭它,如果你倾向于运行存储过程,更新列,然后删除其他行,你可以打开/关闭这三个操作,假设它们都包含在try / catch / finally中。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

如果您在页面的生命周期中进行多次查询,那么您应该确保在页面生命周期内保持连接打开状态。通常,实际上,人们会重复使用跨多个页面的连接。

答案 8 :(得分:1)

我认为一个更好的问题,通过更加明智和富有成效的反馈,可能会提供一些你正在做的事情(代码)的片段,并扩展你做出这个选择的原因。很可能是一个更好的解决方案,不需要保持连接打开这么久,但至少,出于实际的原因,你可以得到一些关于它是否值得改进的反馈。

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

答案 9 :(得分:1)

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