[英]SQL - PreparedStatement - Efficiency - JDBC
这是在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
的第二种方法要好得多,因为它可以使用预先准备好的语句池来提高性能。
在使用Statement
的第一部分中,您的语句与单个数据相关联,必须每次为不同的数据创建一个新语句。
在Prepared Statement的情况下,可以使用不同的数据多次执行相同的语句。
编辑:
你能详细说明一下“通过缓存重用”吗?
PreparedStatement
的缓存是一种透明机制 ,其中Connection
维护一个预准备语句池,当您请求具有相同SQL查询的预准备语句时,将返回缓存的语句。 如果没有缓存,那么每次都必须创建一个新缓存。 该功能取决于驱动程序。
当您使用Prepared语句时,查询仅验证一次,但是当您使用Statement时,它每次都会被验证
不一定是性能优势 ,但使用PreparedStatement
也可以避免SQL注入攻击。
Oracle Prepared Statement Caching
当您创建一个OraclePreparedStatement
或OracleCallableStatement
,JDBC驱动程序会自动搜索匹配的语句缓存。 匹配标准如下:
语句中的SQL字符串必须与缓存中的SQL字符串相同(区分大小写)。
语句类型必须相同(准备或可调用)。
语句生成的可滚动类型的结果集必须相同(仅向前或可滚动)。 您可以在创建语句时确定可滚动性。 (有关完整详细信息,请参阅“指定结果集可滚动性和可更新性”。)
如果在高速缓存搜索期间找到匹配项, 则返回高速缓存的语句 。 如果未找到匹配项,则创建并返回新语句。 当您调用语句对象的close()
方法时,将缓存新语句及其游标和状态。
最有效的方法是使用PreparedStatement
"SELECT * FROM TABLE_1 WHERE ID IN (?,?,?,?,?,.....)"
100个参数并运行13个任务100个ID并行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.