Java 在j2ee项目中应该在什么时候调用connection.close()?

Java 在j2ee项目中应该在什么时候调用connection.close()?,java,servlets,jdbc,Java,Servlets,Jdbc,我没有使用任何框架,因为它只是一个小项目。现在我在主servlet的destroy()方法中调用connection.close()。但也存在一些问题 我不知道什么时候调用了servlet.destroy(),我以为浏览器关闭时就是调用它的时候,但这似乎是错误的 我发现,如果我不操作访问我的项目的页面,一段时间后调用destroy(),那么连接将关闭。但是项目正在运行一些代码,可能会定期写入数据库,这种情况下会引发异常 有什么解决办法吗?我想知道什么时候调用servlet.destroy()。只

我没有使用任何框架,因为它只是一个小项目。现在我在主servlet的
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的所有请求共享,甚至是并发请求,这可能会导致各种严重的并发错误。因此:使用数据源(由连接池支持),在请求需要时获取连接,完成后立即关闭。从连接池数据源关闭连接将使该连接返回池以供重用。