在 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

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

  • 语句中的 SQL 字符串必须与缓存中的字符串相同(区分大小写)。
  • 语句类型必须相同(已准备或可调用)。
  • 语句产生的结果集的可滚动类型必须相同(仅向前或可滚动)。您可以在创建语句时确定可滚动性。 (有关完整的详细信息,请参阅“指定结果集可滚动性和可更新性”。)

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

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

    10-13 03:18