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