在 JDBC 中执行查询的更好方法是什么
案例一
sql = "SELECT * FROM TABLE_1 WHERE ID = 1";
conn.prepareStatement(sql);
ps.executeQuery();
案例二
sql = "SELECT * FROM TABLE_1 WHERE ID = ?";
conn.prepareStatement(sql);
ps.setInt(1,1);
ps.executeQuery();
注意
ps is PreparedStatement
sql is String
我每次都必须查询 1300 个 ID(0 到 1299)。 请具体说明为什么这种情况更好......
我读过 PreparedStatement 预编译查询
最佳答案
第二种方法要好得多使用 PreparedStatement
因为它可以利用 prepared statement pooling 这增加了性能。
Prepared Statement Reuse by caching
在使用 Statement
的第一部分中,您的语句与单个数据相关联,每次都必须为不同的数据创建一个新语句。
在准备语句的情况下,可以使用不同的数据多次执行相同的语句。
编辑:
Can you please elaborate more about "Reuse by caching"???
PreparedStatement
的缓存是一种透明机制,其中 Connection
维护准备好的语句池,当您要求使用相同 SQL 查询的准备好的语句,然后返回缓存的语句。如果没有缓存,那么每次都必须创建一个新的缓存。 该功能取决于驱动程序。
更少的验证开销
当您使用 Prepared statement 时,查询只验证一次,但是当您使用 Statement 时,它每次都会验证
防止SQL注入(inject)
不一定是性能提升,但使用 PreparedStatement
也会让您免受 SQL 注入(inject)攻击。
Oracle Prepared Statement Caching
当您创建 OraclePreparedStatement
或 OracleCallableStatement
时,JDBC 驱动程序会自动在缓存中搜索匹配的语句。匹配标准如下:
语句中的 SQL 字符串必须与缓存中的 SQL 字符串相同(区分大小写)。
语句类型必须相同(准备好的或可调用的)。
语句产生的可滚动类型的结果集必须相同(forward-only 或 scrollable)。您可以在创建语句时确定可滚动性。 (有关完整详细信息,请参阅“指定结果集的可滚动性和可更新性”。)
如果在缓存搜索期间找到匹配项,返回缓存的语句。如果未找到匹配项,则会创建并返回一个新语句。当您调用语句对象的 close()
方法时,会缓存新语句及其游标和状态。
关于java - SQL - PreparedStatement - 效率 - JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947696/