我知道 PreparedStatement 比 Java 中的 Statement 快。
我不知道 oracle db 服务器如何做的。
PreparedStatement 在数据库服务器中预编译 -> 更少的工作。 它减少了数据库的负载。
String sql = "SELECT * FROM users u WHERE u.id = ?";
PreparedStatement pstmt = connenction.prepareStatement(sql);
pstmt.setLong(1, userId);
pstmt.executeQuery();
查询缓存在数据库服务器中,只编译一次?
如果是,数据库服务器如何知道这个查询之前执行过?
它缓存了多长时间?
最佳答案
The query is cached in the database server, and compile only once?
更准确地说,查询计划缓存在服务器上。当您运行查询时,您的 RDBMS 首先准备一个计划,然后执行它。准备计划需要解析查询,然后分析和优化它,同时考虑可用的索引和在参与表上收集的统计信息。
If yes, how the database server knows that this query was execute before?
通过将查询字符串与缓存中可用的其他查询进行比较。由于您使用参数化查询,其他查询在文本上将是相同的。缓存是使用查询参数的第二个主要原因*:如果您准备这样的语句
// WRONG! Don't do it like this!
String sql = "SELECT * FROM users u WHERE u.id = "+userId;
PreparedStatement pstmt = connenction.prepareStatement(sql);
所有性能改进都将消失,因为提供不同的 ID
会使其成为需要新计划的不同查询。
* 参数化查询的首要原因当然是避免注入(inject)攻击。
关于java - PreparedStatement 在 Java 中更快,db 是怎么做到的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26587393/