【问题标题】:Storing database connections in session, in a small scale webapp在会话中存储数据库连接,在小型 web 应用程序中
【发布时间】:2009-09-20 13:09:42
【问题描述】:

我有一个约 20-30 人在内部使用的 j2ee webapp。

用户数量没有显着增长的可能性。

据我了解,在为向 webapp 发出的每个请求打开一个新的数据库连接(昂贵,但在使用数据库时不会阻止其他用户)与使用单例模式(不'不打开新连接,但一次只允许一个用户)。

我认为既然我知道只有 30 个用户会同时使用我的 webapp,也许最简单和最好的解决方案是将连接存储为会话属性,从而将打开的数量减少到最低限度, 同时仍然为每个用​​户分配一个连接。 你怎么看?

【问题讨论】:

    标签: database session jdbc jakarta-ee connection


    【解决方案1】:

    据我了解,有一个 打开新数据库之间的权衡 每个请求的连接 网络应用

    这就是连接池的用途。如果您在应用程序中使用连接池,则该池一旦初始化,将负责在需要时提供连接以供应用程序使用。在经过适当调整的连接池中,将有足够的预留连接创建并提供给应用程序,从而减少仅在应用程序请求连接时创建和打开连接的需要。

    我想,因为我只知道 30 位用户将使用我的 webapp 同时,也许是最简单的 最好的解决方案是存储 连接作为会话属性

    按用户连接不是一个好主意,主要是在涉及 Web 应用程序时。在 Web 应用程序中,用户完全有可能向服务器发起多个请求(想想多标签浏览)。在这种情况下,每个用户使用单个连接将导致奇怪的应用程序行为,除非您同步对连接的访问​​。

    还必须考虑将瞬态属性放入会话的副作用 - 连接对象不可序列化,因此必须标记为瞬态。如果会话在某个时候被反序列化,则必须考虑到 Connection 对象将不可用这一事实,并且必须重新初始化。

    【讨论】:

      【解决方案2】:

      我认为您正在过早地进行优化,尤其是考虑到应用程序的规模。打开一个新连接并不昂贵,就像 Makach 所说,大多数现代 RDBMS 处理连接池,并将为后续请求保持连接打开。可以这么说,你会尝试编写比编译器更好的代码。

      【讨论】:

        【解决方案3】:

        没有。不要那样做。每次需要时重新连接到数据库是完全可以的。我认为任何数据库管理系统都会做自己的连接池缓存。

        如果您想尝试保持打开的连接,您将很难以安全、无错误、安全等方式管理它。

        【讨论】:

        • 好吧,我现在尝试保持连接处于活动状态。 JSP 我已经提出了很多小的 ajax 请求,在这些请求中我确实看到了性能的提升。可能是因为那些ajax请求中发送的查询+数据相当少,所以建立连接造成了大部分开销。此外,我完全理解这种方法“看起来”是错误的,并且像所有程序员一样,我也有针对丑陋代码的强迫症 :) 但是在仔细考虑时,我看不出它会导致任何安全性或错误的任何方式。 ..你能给我举个例子吗?
        猜你喜欢
        • 1970-01-01
        • 2012-07-29
        • 2012-12-09
        • 2013-05-29
        • 2011-08-30
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        相关资源
        最近更新 更多