我遇到了下面的语句,它讲述了我们使用 JDBC PreparedStatement 类获得的性能改进。
如果您为每个查询或数据库更新提交一个新的、完整的 SQL 语句,则数据库必须解析 SQL 并为查询创建查询计划。通过重用现有的 PreparedStatement,您可以为后续查询重用 SQL 解析和查询计划。这通过减少每次执行的解析和查询计划开销来加速查询执行。
假设我正在创建语句并在运行这样的查询时提供不同的值:
String sql = "update people set firstname=? , lastname=? where id=?";
PreparedStatement preparedStatement =
connection.prepareStatement(sql);
preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong (3, 123);
int rowsAffected = preparedStatement.executeUpdate();
preparedStatement.setString(1, "Stan");
preparedStatement.setString(2, "Lee");
preparedStatement.setLong (3, 456);
int rowsAffected = preparedStatement.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
然后我仍然会获得性能优势,因为我正在尝试设置不同的值,以便生成的最终查询根据值进行更改。
您能否准确解释一下我们何时获得性能优势?值也应该相同吗?
当你使用prepared statement(即预编译语句)时,一旦DB得到这个语句,它就会编译它并缓存它,以便它可以使用最后编译的语句来连续调用相同的语句。因此,它会为连续调用进行预编译。
您通常将准备好的语句与绑定变量一起使用,您可以在运行时提供这些变量。现在连续执行准备好的语句会发生什么,您可以提供与先前调用不同的变量。从DB的角度来看,它不必每次都编译语句,只需在朗姆酒时插入绑定变量。所以变得更快。
准备好的语句的其他优点是它可以防止 SQL 注入攻击
所以值不必相同