在Java EE的Session .vs中保存conexion。连接池

时间:2012-03-30 16:31:01

标签: java java-ee database-connection connection-pooling

我知道Java EE的session对象可以存储复杂的对象,例如与数据库的连接。

我正在思考如何使用Java EE实现某个编程实践的应用程序。我使用连接池的第一个选择,使用Java EE非常容易。

我想知道,出于好奇,并且还要正确地证明决定,在客户端启动会话并将其存储在那里时,创建与数据库的连接的优缺点是什么,反对使用连接池。

非常感谢。

2 个答案:

答案 0 :(得分:2)

资源池将以您的系统可以处理的方式优化资源(数据库连接)的处理。即使您有大量已打开的连接,也可能最终耗尽资源。

如果将数据库连接存储在会话上下文中,则更有可能发生这种情况。 Web应用程序不需要一直连接到数据库,该连接可以在新操作开始时建立,最后关闭。使用资源池,当您不再需要时,将连接返回到池中,因此新用户(Web范例中的会话)可以使用您已发布的资源,而不是创建新资源。

该池还将处理某些资源长时间闲置的情况(没有人在特定的时间内使用它们),然后它将释放这些资源。

在会话中存储数据库连接时,您永远不会释放资源,但保留对它的永久引用,只要用户会话执行该引用。您可能不会在短时间内遇到任何问题,特别是如果同时连接的用户非常少。但在现实世界的应用程序中,您将明确地找到它们。

因此,在会话上下文中存储数据库连接被视为不良做法

编辑:我忘了提到只应该在会话中存储Serializable个对象,这样,如果应用服务器决定钝化会话,它可以在应用程序中保留并恢复服务器决定重新激活它。数据库连接不是Serializable资源。

答案 1 :(得分:1)

使用连接池可以最大限度地提高连接的可用性。这意味着更少的连接=更少的内存=更少的套接字等。如果有人意外退出会发生池比保存会话更好的原因吗?如果您的会话中有连接,则可能会无限期地保持该连接长时间保持活动状态。