首页 文章

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

提问于
浏览
28

关于JDBC编码的几个问题:

  • 对于单个客户端应用程序,我们是否需要连接池?

  • 在开始时创建一个Connection并保持活着而不关闭它直到应用程序退出是一个好主意吗?为什么?

  • PreparedStatement与Connection关联,如果我的连接在每个查询后没有关闭,为什么不保持PreparedStatement活着并在其他方法中重用它?

  • 如果我们为每个查询创建PreparedStatement,数据库是否知道它是相同的PreparedStaement并在第一次之后忽略不必要的操作?

  • PreparedStatement是不是只创建一次并重用多次语句?如果是的话,为什么每次都需要关闭它?

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

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

谢谢,

2 回答

  • 2

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

    通常,使用池时:

    • 关闭连接实际上只是将其返回到池中

    • 准备语句的行为将从Connection的语句缓存中检索先前准备的语句,或者如果一个语句不可用,则创建一个新语句并将其缓存以供以后使用 .

    • 关闭PreparedStatement的行为实际上只是将它返回到连接的语句缓存 .

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

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

  • 14

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

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

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

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

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

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

相关问题