何时在JDBC中关闭Connection,Statement,PreparedStatement和ResultSet

时间:2009-06-24 16:22:31

标签: java jdbc connection resultset

关于JDBC编码的几个问题:

  1. 对于单个客户端应用程序,我们是否需要连接池?
  2. 最好在开始时创建一个Connection并保持活着而不关闭它直到应用程序退出?为什么?
  3. PreparedStatement与Connection相关联,如果我的连接在每个查询后没有关闭,为什么不保持PreparedStatement存活并在其他方法中重用它?
  4. 如果我们为每个查询创建PreparedStatement,数据库是否知道它是相同的PreparedStaement并在第一次之后忽略不必要的操作?
  5. PreparedStatement不会创建一次并重复使用多次语句?如果是,为什么每次都需要关闭它?
  6. 我知道对close()的调用会释放资源。但是如果我们知道我们稍后会使用它,为什么要释放它然后再请求它呢?

    多客户端应用程序怎么样?我们需要连接池,所以我们每次都需要创建和关闭Connection,Statement和PreparedStatement吗?

    感谢,

2 个答案:

答案 0 :(得分:14)

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

通常,使用游泳池时:

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

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

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

答案 1 :(得分:2)

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

2。打开连接并永久打开它有两个原因,这不是一个好主意。首先,如果存在临时网络中断,则连接可能会中断。它打开的时间越长,在需要时就越有可能死亡。其次,失败的交易可能使连接处于不适合继续操作的状态。最好的方法是打开一些连接,重复使用5到10分钟,然后再回收它们。

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

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

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

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