Java JNDI DB连接可以存储在会话中吗?

Java JNDI DB连接可以存储在会话中吗?,java,Java,我正在通过JNDI连接MS SQL Server。我的应用程序将连接到DB一次,并将存储con供将来使用。我能够成功连接和检索所需数据。但是,当数据库重新启动时,我失去了连接,因为我得到了“由对等方重置的连接:套接字写入错误” 因此,我需要重新启动我的应用程序。所以,我决定在我的conn通过代码关闭时创建连接。这样做对吗?我应该在会话中存储conn吗?不要。它会很脆 使用连接池,最好是在分发之前能够探测连接以确保其有效的连接池 如果您的容器没有提供这样的池,您可以在web应用程序中使用自己的池

我正在通过JNDI连接MS SQL Server。我的应用程序将连接到DB一次,并将存储con供将来使用。我能够成功连接和检索所需数据。但是,当数据库重新启动时,我失去了连接,因为我得到了“由对等方重置的连接:套接字写入错误”


因此,我需要重新启动我的应用程序。所以,我决定在我的conn通过代码关闭时创建连接。这样做对吗?我应该在会话中存储conn吗?

不要。它会很脆

使用连接池,最好是在分发之前能够探测连接以确保其有效的连接池


如果您的容器没有提供这样的池,您可以在web应用程序中使用自己的池

当您不需要时,不应保持与DB的活动连接。一旦任务完成并且不再需要处理数据,您就应该关闭它。当您再次需要它时,请向数据源请求新的数据源。
因此您希望将此数据库的数据源对象保留在某个位置。

不要!使用类似的方法创建连接池,从中可以查找连接。当您需要连接时,请从池中查找,完成后,将其释放回池中。连接对象生命周期将由dbcp库管理。

这就是诸如Apache dbcp之类的连接池的用途

在会话中保留对池的引用,并在需要连接时使用它,如以下示例所示:


这里的答案相同:使用连接池


我建议使用而不是旧的Apache DBCP,即使对于独立/非web应用程序,也不要在任何容器中运行

谢谢您的回复。。那么,每次请求数据时,是否可以调用dataSource.getConnection()?完成后关闭该连接。请澄清…是的,但数据源将决定是否关闭连接-请参阅NickJ回答如何使用数据库池连接将数据源。getConnection()从dpcp检索连接。如果每个请求都被调用,这不是为每个请求创建新连接吗?这取决于您如何配置它,在您告诉它关闭后,连接应该以多快的速度关闭。它被称为池,因为它可能会返回一些旧的仍处于活动状态的连接,而不会创建一个。是的,我同意。如果是部署在Tomcat、JBoss等服务器中的web应用程序,请使用服务器提供的数据源。如果它是一个独立的Java应用程序,Apache DBCP仍然保持良好的性能。:)@Richie不,我的意思是,如果这是一个独立的应用程序,像批处理一样,我建议使用更快的Tomcat连接池