繁体   English   中英

SQL - PreparedStatement - 效率 - JDBC

[英]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时,它每次都会被验证

防止SQL注入

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

Oracle Prepared Statement Caching

当您创建一个OraclePreparedStatementOracleCallableStatement ,JDBC驱动程序会自动搜索匹配的语句缓存。 匹配标准如下:

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

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

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

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

最有效的方法是使用PreparedStatement

"SELECT * FROM TABLE_1 WHERE ID IN (?,?,?,?,?,.....)"

100个参数并运行13个任务100个ID并行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM