【发布时间】:2021-11-09 15:34:12
【问题描述】:
更新 2 反对票是应得的,并鼓励我编写一个更强大的测试:使用 java 1.8,ojdbc8.jar 对抗非生产,Oracle 12C我通常是唯一用户的数据库, 我运行了 100 次选择的 10 次迭代:50 次使用 PreparedStatement,50 次使用 Statement(使用字符串连接构建查询)。 为了尝试排除某种数据库缓存,我再次运行测试,但切换了顺序,首先运行语句,然后运行 PreparedStatements。 无论顺序如何,性能没有显着差异。结果见下文(以毫秒为单位,带有平均值和标准偏差)。
更新:感谢您的所有意见。我更新了标题。我在研究这个时发现了很多陈词滥调(“PreparedStatements 总是更快”,“PreparedStatements 总是更慢”),但没有确定的结果,我最终编写了一个测试,发现对于这种情况,PreparedStatements 始终如一~慢 25%。
最初的问题: 我有一个带有简单查询的静态方法,用于检查数据库中是否已经存在 ID:
public static boolean isPersisted(Integer id) {
String sql = "select id from table where id = ?;
我知道它们可以防止 SQL 注入,并且我知道它们在循环插入带有 ID 列表的插入时提供了很大的好处(例如)但是,是否有任何 性能/内存优势在这里使用准备好的语句?
【问题讨论】:
-
PreparedStatement 可用于应用程序的整个生命周期。数据库不必每次都重新解析查询
-
你问错了问题:不要养成用这样的字符串连接构建 SQL 查询的习惯,你不会因为几年后有人利用漏洞而丢掉工作......性能和内存方面的考虑几乎总是远远低于维护系统的完整性。
-
一些数据库服务器维护已解析语句的缓存,因此以
id = ?样式重复运行应该重新使用已解析语句(并且可能是执行计划)。如果您运行 1000 次id = actualvalue,那么服务器可能会丢弃其他(可能更复杂的评估)应用程序 SQL,并且您的错误代码的影响可能在其他地方很明显。优秀的数据库管理员可能会发现这一点并要求修复。 -
你的例子不是静态查询,是参数化的。
标签: java jdbc prepared-statement