在 JDBC 中执行查询的更好方法是什么
案例 1
sql = "SELECT * FROM TABLE_1 WHERE ID = 1";
conn.prepareStatement(sql);
ps.executeQuery();
案例 2
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 Reuse by caching
在使用 Statement
的第一部分中,您的语句与单个数据相关联,每次都必须为不同的数据创建一个新语句。
在 Prepared Statement 的情况下,可以使用不同的数据多次执行相同的语句。
编辑:
PreparedStatement
的缓存是一种 透明机制 ,其中 Connection
维护一个准备好的语句池,当您使用相同的 SQL 查询请求准备好的语句时,会返回一个缓存的语句。如果没有缓存,那么每次都必须创建一个新的缓存。该功能取决于驱动程序。
更少的验证开销
当您使用 Prepared 语句时,查询仅验证一次,但是当您使用 Statement 时,它每次都验证
防止 SQL 注入(inject)
不一定是性能优势,但使用 PreparedStatement
也可以避免 SQL 注入(inject)攻击。
Oracle Prepared Statement Caching
创建 OraclePreparedStatement
或 OracleCallableStatement
时,JDBC 驱动程序会自动在缓存中搜索匹配的语句。匹配标准如下:
如果在缓存搜索期间找到匹配项,则返回缓存的语句。如果未找到匹配项,则创建并返回一条新语句。当您调用语句对象的
close()
方法时,新语句及其游标和状态将被缓存。关于java - SQL - PreparedStatement - 效率 - JDBC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20947696/