PreparedStatement在Java中更快,db如何做到这一点?

lol*_*olo 4 java oracle jdbc prepared-statement

我知道PreparedStatement比Java中的Statement更快.

我不知道oracle db server是如何做到的.

PreparedStatement得到预编译在数据库服务器 - >少工作.它减少了数据库的负担.

String sql = "SELECT * FROM users u WHERE u.id = ?";
PreparedStatement pstmt = connenction.prepareStatement(sql);
pstmt.setLong(1, userId);
pstmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

查询缓存在数据库服务器中,只编译一次?
如果是,数据库服务器如何知道此查询之前执行过?
它缓存了多长时间?

das*_*ght 8

查询缓存在数据库服务器中,只编译一次?

更确切地说,查询计划缓存在服务器上.运行查询时,RDBMS首先准备计划,然后执行它.准备计划需要解析查询,然后分析和优化它,考虑可用的索引和参与表上收集的统计信息.

如果是,数据库服务器如何知道此查询之前执行过?

通过将查询字符串与缓存中可用的其他查询进行比较.由于您使用参数化查询,因此另一个查询在文本上是相同的.缓存是第二大原因*使用查询参数:如果你准备这样的语句

// WRONG! Don't do it like this!
String sql = "SELECT * FROM users u WHERE u.id = "+userId;
PreparedStatement pstmt = connenction.prepareStatement(sql);
Run Code Online (Sandbox Code Playgroud)

所有的性能改进都将消失,因为提供不同的ID将使它成为需要新计划的不同查询.

*参数化查询的首要原因当然是避免注入攻击.