MRa*_*ser 6 java architecture performance jdbc prepared-statement
我们都知道 的是,我们应该宁可重复使用JDBC PreparedStatement不是一个循环中创建一个新的实例.
但是如何处理PreparedStatement不同方法调用之间的重用?重用 - "规则"仍然有效吗?
我是否应该考虑使用字段,PreparedStatement还是应该在每次调用时关闭并重新创建预准备语句(保持本地)?(当然,这样一个类的实例将被绑定到Connection某些架构中可能是一个缺点)
我知道理想的答案可能是"它取决于".
但我正在寻找经验不足的开发人员的最佳实践,他们将在大多数情况下做出正确的选择.
ska*_*man 13
当然,这样一个类的实例将绑定到一个可能不利的Connection
可能?这将是一个巨大的劣势.您需要同步对它的访问权限,这会导致您的多用户性能下降,或者创建多个实例并将它们保存在池中.屁股的主要痛苦.
语句池是JDBC驱动程序的工作,大多数(如果不是全部)当前的驱动程序都会为您执行此操作.当您调用prepareStatement或时prepareCall,驱动程序将处理现有资源和预编译语句的重用.
Statement 对象绑定到连接,应该使用连接并尽快返回池中.
简而言之,在PreparedStatement方法开始时获得a ,在循环内重复使用,然后在方法结束时关闭它的标准实践是最佳实践.
许多数据库工作负载受CPU限制,而不受IO限制.这意味着数据库最终花费更多时间来完成工作,例如解析SQL查询并找出如何处理它们(执行"执行计划"),而不是花费在访问磁盘上."交易"工作负载比"报告"工作负载更为真实,但在这两种情况下,准备计划所花费的时间可能比预期的要多.
因此,如果语句将经常执行并且在方法调用之间进行(正确)安排以缓存PreparedStatements'的麻烦值得您的开发人员时间,这总是一个好主意.与性能一样,测量是关键,但如果你能够以低廉的价格做到这一点,请将您的PreparedStatement缓存出习惯.
某些JDBC驱动程序和/或连接池提供透明的"预准备语句缓存",因此您无需自己执行此操作.只要您了解特定选择的透明缓存策略的行为,就可以让它跟踪事物......您真正想要避免的是数据库的命中.
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |