2009-06-24 100 views
27

几个问题上的JDBC编码:当关闭连接,语句的PreparedStatement和ResultSet中JDBC

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

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

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

感谢,

+0

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection – tetsuo 2012-09-24 15:19:26

回答

12

个人而言,我会使用一个游泳池,因为这会照顾所有的资源管理的为您服务。如果您的连接需求发生变化,您可以轻松修改池配置。通过一个池,您可以打开/关闭连接并根据best-practice准备语句,并将资源管理留在池中。

通常,使用一个池时:

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

而且 - 这取决于池的实现 - 它可能是能够通知您是否有资源泄漏使其更容易识别代码中的这些各种各样的问题。

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

+0

不要相信你的池:http:// stackoverflow。 com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separate-though-the-connection – tetsuo 2012-09-24 15:19:02

1

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

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

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

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

5.没有必要关闭并准备再次使用不同参数的语句。只需再次设置参数并执行。

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