Java 在j2ee项目中应该在什么时候调用connection.close()?
我没有使用任何框架,因为它只是一个小项目。现在我在主servlet的Java 在j2ee项目中应该在什么时候调用connection.close()?,java,servlets,jdbc,Java,Servlets,Jdbc,我没有使用任何框架,因为它只是一个小项目。现在我在主servlet的destroy()方法中调用connection.close()。但也存在一些问题 我不知道什么时候调用了servlet.destroy(),我以为浏览器关闭时就是调用它的时候,但这似乎是错误的 我发现,如果我不操作访问我的项目的页面,一段时间后调用destroy(),那么连接将关闭。但是项目正在运行一些代码,可能会定期写入数据库,这种情况下会引发异常 有什么解决办法吗?我想知道什么时候调用servlet.destroy()。只
destroy()
方法中调用connection.close()
。但也存在一些问题
servlet.destroy()
,我以为浏览器关闭时就是调用它的时候,但这似乎是错误的destroy()
,那么连接将关闭。但是项目正在运行一些代码,可能会定期写入数据库,这种情况下会引发异常有什么解决办法吗?我想知道什么时候调用
servlet.destroy()
。只有当您有一个共享连接时才有效
更好的解决方案是使用内置在servlet引擎中的JNDI连接池功能。您希望在尽可能小的方法范围内使用连接,并将其返回到池中。通过这种方式,您可以使用一个小型连接池为更多的客户端提供服务。每次需要连接时,您都需要从数据源获取一个连接,并在使用完毕后立即使用try with resources将其关闭。不应在并发请求之间共享连接。请认识到,您独特的servlet实例服务于使用您的webapp的所有用户的请求。您还需要了解事务。@JBNizet但我记得有人说过构建连接非常昂贵,所以我们不应该在每次执行查询时构建一个连接并关闭它?这就是为什么Java EE数据源由连接池备份的原因。关闭连接只会将连接返回到池,然后可以在池中重用。是的,我现在将连接设置为单例连接。那么,你的意思是如果我使用JNDI连接池,我就不会担心什么时候关闭连接了?就像没有像
connection.close()
这样的方法一样,当我关闭项目时,池会为我关闭它们?Singleton永远无法扩展。您最好放弃该解决方案。好的,我会这样更改它~您知道什么时候调用servlet.destroy()
?我很好奇服务器何时关闭。这不是放置任何东西的地方。@在一个servlet中只有一个连接意味着它将被该servlet的所有请求共享,甚至是并发请求,这可能会导致各种严重的并发错误。因此:使用数据源(由连接池支持),在请求需要时获取连接,完成后立即关闭。从连接池数据源关闭连接将使该连接返回池以供重用。