Java 何时关闭JDBC中的连接、语句、PreparedStatement和结果集

Java 何时关闭JDBC中的连接、语句、PreparedStatement和结果集,java,jdbc,connection,resultset,Java,Jdbc,Connection,Resultset,关于JDBC编码的几个问题: 对于单个客户端应用程序,是否需要连接池 一开始就创建一个连接,在应用程序退出之前不关闭它就让它保持活动状态,这是一个好主意吗?为什么? PreparedStatement与Connection关联,如果每次查询后我的连接都没有关闭,为什么不让PreparedStatement保持活动状态,并在其他方法中重用它 如果我们创建每个查询PreparedStatement,数据库是否知道它是相同的PreparedStatement,并在第一次之后忽略不必要的操作 Prepa

关于JDBC编码的几个问题:

  • 对于单个客户端应用程序,是否需要连接池
  • 一开始就创建一个
    连接
    ,在应用程序退出之前不关闭它就让它保持活动状态,这是一个好主意吗?为什么?
  • PreparedStatement
    Connection
    关联,如果每次查询后我的连接都没有关闭,为什么不让
    PreparedStatement
    保持活动状态,并在其他方法中重用它
  • 如果我们创建每个查询
    PreparedStatement
    ,数据库是否知道它是相同的
    PreparedStatement
    ,并在第一次之后忽略不必要的操作
  • PreparedStatement
    不是一次创建多次重用语句吗?如果是,为什么每次都需要关闭它
  • 我知道调用
    close()
    将释放资源。但是,如果我们知道以后会使用它,为什么要发布它,然后再请求它呢

    多客户端应用程序怎么样?我们需要一个连接池,所以每次都需要创建和关闭连接、
    语句
    准备语句


    谢谢。

    就我个人而言,我会使用一个池,因为这将为您管理所有的资源。如果您的连接要求发生更改,则可以轻松修改池配置。有了池,您可以根据打开/关闭连接和准备好的语句,并将资源管理留给池

    通常,在使用池时:

    • 关闭连接实际上只是将其返回到池中
    • 准备语句的操作将从连接的语句缓存中检索以前准备好的语句,或者如果没有,则创建一个新语句并缓存它以供以后使用
    • 关闭PreparedStatement的行为实际上只是将其返回到连接的语句缓存中
    此外,根据池实现的不同,它可能会在出现资源泄漏时通知您,从而更容易识别代码中的此类问题


    请看一看示例实现的源代码,如-了解它们的工作原理非常有趣。

    1。即使您只有一个客户端,连接池也可能是有益的。连接到数据库可能需要很长的时间,因此经常这样做可能会降低您的应用程序的速度,降低网络请求的速度。此外,正如@teabot所解释的,池可能有助于识别是否有任何连接未关闭

    2.出于两个原因,打开一个连接并让它永远打开不是一个好主意。首先,如果出现临时网络中断,连接可能会中断。打开的时间越长,在需要时就越有可能死亡。其次,失败的事务可能会使连接处于不适合继续操作的状态。最好的方法通常是打开几个连接,重复使用它们五到十分钟,然后回收它们

    3.根据数据库和驱动程序的不同,连接可能有一个准备好的语句缓存。即使使用不同的连接,RDBMS通常也会缓存包括it参数在内的完全相同的语句。因此,从表中选择*值=?作为一个准备好的语句,它将跨连接缓存,但如果您指定参数值,如SELECT*FROM table WHERE value='your_data',那么它可能不会缓存到服务器端

    4.如第3节所述,根据RDBMS的实现,做一个基准测试

    5.无需关闭并再次准备一条语句,该语句将使用不同的参数重复使用。只需再次设置参数并执行


    对于多个客户端,数据库总是有一个并发连接限制,这个限制通常不是很大的数字。如果所有客户端都通过一个webapp,那么像DBCP这样的池就可以了。但显然,不希望为每个客户端创建一个永久打开多个连接的池。

    不要信任您的池:@teabot I在每次查询执行后关闭所有对象,包括连接。为每个请求而不是每个语句打开和关闭连接是否更好?我的意思是,每次使用都会关闭语句和结果集,但每个请求都会关闭一个连接(在请求开始时打开,在上次查询执行结束时关闭)@teabot你能更新最佳实践链接吗,it 404