何时closuresJDBC中的Connection,Statement,PreparedStatement和ResultSet
关于JDBC编码的几个问题:
- 对于单个客户端应用程序,我们是否需要连接池?
- 在开始时创build一个Connection并保持活动状态而不closures它是一个好主意,直到应用程序退出? 为什么?
- PreparedStatement与Connection关联,如果在每个查询之后我的连接没有closures,为什么不保持PreparedStatement的存在并在其他方法中重用呢?
- 如果我们创buildPreparedStatement每个查询,数据库知道它是相同的PreparedStaement并在第一次后忽略不必要的操作?
- PreparedStatement是不是一次创build和重用多次声明? 如果是,为什么每次都需要closures它?
我知道调用close()会释放资源。 但是如果我们知道我们稍后会使用它,为什么要释放它,然后再请求它呢?
多客户端应用程序如何? 我们需要连接池,所以我们需要每次创build和closures连接,语句和PreparedStatement?
谢谢,
就我个人而言,我会使用一个池,因为这将为您处理所有的资源pipe理。 如果您的连接需求改变,那么您可以轻松修改池configuration。 通过一个池,您可以打开/closures连接,并根据最佳实践准备好语句,并将资源pipe理留在池中。
通常,使用池时:
- closures连接实际上只是将其返回到池
- 准备语句的行为将从Connection的语句高速caching中检索先前准备好的语句,或者如果某个语句不可用,则创build一个新语句并将其caching起来以供以后使用。
- closures一个PreparedStatement的行为实际上只是将它返回给连接的语句caching。
此外 – 根据池实现 – 它可能能够通知您何时有资源泄漏,使您更容易识别代码中的这些types的问题。
看看像DBCP这样的示例实现的源代码 – 看看它们是如何工作是非常有趣的。
1.即使你有一个客户端,连接池也可能是有益的。 连接到数据库可能需要很长的时间,因此经常会导致应用程序的networking请求速度变慢。 此外,正如@teabot所解释的,一个池可以帮助识别是否有任何连接没有被closures。
2.打开连接并将其永远打开是不好的,原因有两个。 首先,如果暂时的networking中断,连接可能会死亡。 打开的时间越长,在需要时就越有可能死亡。 其次,失败的交易可能会使连接处于不适合继续运营的状态。 最好的方法是打开几个连接,重新使用它们五到十分钟,然后回收它们。
3.根据数据库和驱动程序,连接可能有一个预备的语句caching。 即使使用不同的连接,RDBMS通常也会caching包含参数的语句。 因此SELECT * FROM表WHERE value =? 因为准备好的语句将跨连接进行caching,但是如果您指定的参数值类似于SELECT * FROM table WHERE value ='your_data',那么很可能它不会被caching在服务器端。
4.如3所述,取决于RDBMS的实施,做一个基准。
5.没有必要closures和准备一个将被重复使用的参数不同的语句。 只需再次设置参数并执行。
对于多个客户端,数据库将始终具有并发连接限制,通常不是任何大数目。 如果所有的客户端都通过webapp,那么像DBCP这样的池就可以。 但是,显然不希望为每个客户端创build一个池,并且永久打开多个连接。