我知道Java EE的session
对象可以存储复杂的对象,例如与数据库的连接。
我正在思考如何使用Java EE实现某个编程实践的应用程序。我使用连接池的第一个选择,使用Java EE非常容易。
我想知道,出于好奇,并且还要正确地证明决定,在客户端启动会话并将其存储在那里时,创建与数据库的连接的优缺点是什么,反对使用连接池。
非常感谢。
答案 0 :(得分:2)
资源池将以您的系统可以处理的方式优化资源(数据库连接)的处理。即使您有大量已打开的连接,也可能最终耗尽资源。
如果将数据库连接存储在会话上下文中,则更有可能发生这种情况。 Web应用程序不需要一直连接到数据库,该连接可以在新操作开始时建立,最后关闭。使用资源池,当您不再需要时,将连接返回到池中,因此新用户(Web范例中的会话)可以使用您已发布的资源,而不是创建新资源。
该池还将处理某些资源长时间闲置的情况(没有人在特定的时间内使用它们),然后它将释放这些资源。
在会话中存储数据库连接时,您永远不会释放资源,但保留对它的永久引用,只要用户会话执行该引用。您可能不会在短时间内遇到任何问题,特别是如果同时连接的用户非常少。但在现实世界的应用程序中,您将明确地找到它们。
因此,在会话上下文中存储数据库连接被视为不良做法。
编辑:我忘了提到只应该在会话中存储Serializable
个对象,这样,如果应用服务器决定钝化会话,它可以在应用程序中保留并恢复服务器决定重新激活它。数据库连接不是Serializable
资源。
答案 1 :(得分:1)
使用连接池可以最大限度地提高连接的可用性。这意味着更少的连接=更少的内存=更少的套接字等。如果有人意外退出会发生池比保存会话更好的原因吗?如果您的会话中有连接,则可能会无限期地保持该连接长时间保持活动状态。