SQL - PreparedStatement - 效率 - JDBC

3

我可以帮助您翻译内容,以下是需要翻译的文本:

使用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可以预编译查询语句。


你在使用哪种数据库管理系统?Postgres?Oracle? - user330315
我们使用Oracle作为我们的后端... - SRCM
2个回答

5

第二种方法更好,使用PreparedStatement,因为它可以利用预处理语句池来提高性能。

通过缓存准备语句重用

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

在准备语句的情况下,可以使用不同的数据多次执行相同的语句。

编辑:

您能否详细说明“通过缓存重用”?

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

较少的验证开销

当您使用预编译语句时,查询仅在第一次验证,但是当您使用语句时,每次都会进行验证。
防止SQL注入攻击 PreparedStatement的使用不一定能提高性能,但也可以防止SQL注入攻击。 Oracle Prepared Statement Caching 当您创建一个OraclePreparedStatementOracleCallableStatement时,JDBC驱动程序会自动搜索缓存以查找匹配的语句。匹配条件如下:
- 语句中的SQL字符串必须与缓存中的字符串完全相同(区分大小写)。 - 语句类型必须相同(预编译或可调用)。 - 语句生成的结果集的可滚动类型必须相同(仅向前或可滚动)。您可以在创建语句时确定可滚动性。 (有关完整详细信息,请参见“指定结果集可滚动性和可更新性”)。
如果在缓存搜索期间找到匹配项,则返回缓存的语句。如果未找到匹配项,则创建并返回新语句。当调用语句对象的close()方法时,新语句及其游标和状态将被缓存。

1
我已经添加了一个来自Oracle文档的链接,详细解释了语句缓存。 - Narendra Pathai

1
最高效的方法是使用 PreparedStatement。
"SELECT * FROM TABLE_1 WHERE ID IN (?,?,?,?,?,.....)"

使用100个参数并行运行13个任务,每个任务并行处理100个ID。

他没有提到ID总是0-1299吗?如果是这样,那么使用 WHERE ID >= 0 AND ID <= 1299 不是更有效率吗? - Sami Korhonen
如果Sami Korhonen想要固定的ID >= <=,这样做更有意义,但是并行处理可以将速度提高数倍。 - Evgeniy Dorofeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接