在方法之间重用PreparedStatement?

我们都知道 ,我们应该重新使用JDBC PreparedStatement不是在循环中创建新实例。

但是如何处理不同方法调用之间的PreparedStatement重用? 重用 – “规则”仍然有效吗?

我是否应该考虑为PreparedStatement使用字段,还是应该在每次调用时关闭并重新创建预准备语句(保持本地状态)? (当然,这样一个类的实例将绑定到一个Connection ,这在某些架构中可能是一个缺点)

我知道理想的答案可能是“它取决于”。
但我正在寻找经验不足的开发人员的最佳实践,他们将在大多数情况下做出正确的选择。

当然,这样一个类的实例将绑定到一个可能不利的Connection

可能? 这将是一个巨大的劣势。 您需要同步对它的访问权限,这会使您的多用户性能死亡,或者创建多个实例并将它们保存在池中。 屁股的主要痛苦。

语句池是JDBC驱动程序的工作,大多数(如果不是全部)当前的驱动程序都会为您执行此操作。 当您调用prepareStatementprepareCall ,驱动程序将处理现有资源和预编译语句的重用。

Statement对象绑定到一个连接,应该使用连接并尽快返回池中。

简而言之,在方法开始时获取PreparedStatement ,在循环中重复使用PreparedStatement ,然后在方法结束时关闭它的标准做法最佳实践。

许多数据库工作负载受CPU限制,而不受IO限制。 这意味着数据库最终花费更多时间来完成工作,例如解析SQL查询并找出如何处理它们(执行“执行计划”),而不是花费在访问磁盘上。 “交易”工作负载比“报告”工作负载更为真实,但在这两种情况下,准备计划所花费的时间可能比预期的要多。

因此,如果语句将经常执行并且在方法调用之间进行(正确)安排以缓存PreparedStatements’的麻烦值得您的开发人员时间,这总是一个好主意。 与性能一样,测量是关键,但如果你能够以足够低的成本做到这一点,请将您的PreparedStatement缓存出习惯。

某些JDBC驱动程序和/或连接池提供透明的“预准备语句缓存”,因此您无需自己执行此操作。 只要您了解特定选择的透明缓存策略的行为,就可以让它跟踪事物……您真正想要避免的是数据库的命中。

是的,它可以重复使用,但我相信只有在使用相同的Connection对象并且您正在使用数据库连接池(例如,在Web应用程序中)时才会计算,那么Connection对象每次都可能不同。

出于这个原因,我总是在每次在Web应用程序中使用之前重新创建PreparedStatement

如果您没有使用连接池,那么您就是金色的!

我没有看到区别:如果我对同一个连接重复执行相同的语句,为什么不以任何方式重用PreparedStatement ? 如果多个方法执行相同的语句,那么该语句可能需要封装在自己的方法中(甚至是自己的类)。 这样你就不需要传递PreparedStatement