java - PreparedStatement 在 Java 中更快,db 是怎么做到的?

标签 java oracle jdbc prepared-statement

我知道 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/

相关文章:

java - SOAP Web 服务中的用户身份验证

java - JAXB/Moxy 将 XmlElements 与 XmlAdapter 结合使用

java - 从 TableView 中删除行时的事件处理程序

php - 如何将php变量插入到oracle表中?

java - 只有当查询包含 FIRST_ROWS 或 ROWNUM 限制时,ResultSet.next 才会非常慢

java.net.SocketInputStream.socketRead0( native 方法)

java - 在 java 6 Update 45 上运行的 Oracle Forms

sql - 甲骨文 SQL : Merge rows into single row

java - 在 Java 程序中调用 PL/SQL 包代码

java - 有什么方法可以将 sql2o 的结果集映射为泛型吗?