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

2022-09-01 07:01:15

关于JDBC编码的几个问题:

  1. 对于单个客户端应用程序,我们是否需要连接池?
  2. 在开始时创建一个并保持活动状态而不关闭它直到应用程序退出是一个好主意吗?为什么?Connection
  3. PreparedStatement与 相关联,如果我的连接在每次查询后都没有关闭,为什么不保持活动状态并在其他方法中重用它?ConnectionPreparedStatement
  4. 如果我们创建每个查询,数据库是否知道它是相同的,并在第一次之后忽略不必要的操作?PreparedStatementPreparedStatement
  5. PreparedStatement不是创建一次并重用多次语句?如果是,为什么每次都需要关闭它?

我知道调用将释放资源。但是,如果我们知道以后要使用它,为什么要释放它,然后再请求它呢?close()

多客户端应用程序怎么样?我们需要一个连接池,因此我们需要创建并关闭连接,并且每次?StatementPreparedStatement


答案 1

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

通常,使用池时:

  • 关闭连接实际上只会将其返回到池中
  • 准备语句的操作将从 Connection 的语句高速缓存中检索以前准备好的语句,或者如果该语句不可用,则创建一个新语句并高速缓存该语句以供以后使用。
  • 关闭 PreparedStatement 的操作实际上只会将其返回到连接的语句缓存中。

此外, 根据池实现 - 它可能能够在资源泄漏时通知您,从而更轻松地识别代码中的此类问题。

看看像DBCP这样的示例实现的来源 - 看看它们是如何工作的非常有趣。


答案 2

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

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

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

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

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

对于多个客户端,数据库将始终具有并发连接限制,该限制通常不是任何大数字。如果所有客户端都通过 Web 应用,则像 DBCP 这样的池就没问题了。但显然,为每个永久打开多个连接的客户端创建一个池是不可取的。


推荐