SQL - PreparedStatement - 效率 - JDBC

SRC*_*RCM 3 java sql oracle jdbc

这是在JDBC中执行查询的更好方法

情况1

sql = "SELECT * FROM TABLE_1 WHERE ID = 1";
conn.prepareStatement(sql);
ps.executeQuery();
Run Code Online (Sandbox Code Playgroud)

案例2

sql = "SELECT * FROM TABLE_1 WHERE ID = ?";
conn.prepareStatement(sql);
ps.setInt(1,1);
ps.executeQuery();
Run Code Online (Sandbox Code Playgroud)

注意

ps is PreparedStatement 
sql is String
Run Code Online (Sandbox Code Playgroud)

我每次都要查询1300个ID(0到1299).请说明为什么那个案子更好......

我已经读过PreparedStatement预编译查询

Nar*_*hai 5

第二种方式是更好的使用PreparedStatement,因为它可以利用事先准备好的声明池从而提高性能.

准备好的语句通过缓存重用

在第一部分中,使用Statement您的语句绑定到单个数据,每次必须为不同的数据创建一个新语句.

在Prepared Statement的情况下,可以使用不同的数据多次执行相同的语句.

编辑:

你能详细说明一下"通过缓存重用"吗?

缓存PreparedStatements是一种透明机制,其中Connection维护一个预准备语句池,当您请求具有相同SQL查询的预准备语句时,则返回缓存的语句.如果没有缓存,那么每次都必须创建一个新缓存.该功能取决于驱动程序.

较少的验证开销

当您使用Prepared语句时,查询仅验证一次,但是当您使用Statement时,它每次都会被验证

防止SQL注入

不一定是性能优势,但使用PreparedStatement也可以避免SQL注入攻击.

Oracle Prepared Statement Caching

创建OraclePreparedStatement或时OracleCallableStatement,JDBC驱动程序会自动在缓存中搜索匹配的语句.匹配标准如下:

  • 语句中的SQL字符串必须与缓存中的SQL字符串相同(区分大小写).

  • 语句类型必须相同(准备或可调用).

  • 语句生成的可滚动类型的结果集必须相同(仅向前或可滚动).您可以在创建语句时确定可滚动性.(有关完整详细信息,请参阅"指定结果集可滚动性和可更新性".)

如果在高速缓存搜索期间找到匹配项,则返回高速缓存的语句.如果未找到匹配项,则创建并返回新语句.调用close()语句对象的方法时,将缓存新语句及其游标和状态.