java - SQL - PreparedStatement - 效率 - JDBC

标签 java sql oracle jdbc

在 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

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

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

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

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

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

关于java - SQL - PreparedStatement - 效率 - JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947696/

相关文章:

java - 在类型类 ...myPackageHere... 的 Spring 上下文中找不到一个或多个 bean,跳过该类型

Mysql:表中有数百万条记录,一天更新 1000 万次

mysql - sql 中最常出现的值

oracle - Oracle 的 ALL_TAB_COLUMNS 表中的 BIN$... 表是什么?

sql - 如何在时间未知时按日期删除行

java - 显示 JTabbedPane 的第一个选项卡

java - TrueType Collection (.ttc) 在 Java Swing 中设置为字体

java - Android FireStore 以列表形式检索

sql - 将列中的随机字符串添加到数据库中的每一行

sql - 如果存在多个表的记录,如何返回 bool 值