SQL - PreparedStatement - 效率 - JDBC

时间:2014-01-06 10:16:25

标签: java sql oracle 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预编译查询

2 个答案:

答案 0 :(得分:5)

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

Prepared Statement Reuse by caching

在使用Statement的第一部分中,您的语句与单个数据相关联,必须每次为不同的数据创建一个新语句。

对于Prepared Statement,可以使用不同的数据多次执行相同的语句。

修改

  

请详细说明“缓存重用”???

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

较少验证开销

当您使用Prepared语句时,查询仅验证一次,但是当您使用Statement时,它每次都会被验证

防止SQL注入

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

Oracle Prepared Statement Caching

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

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

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

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

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

答案 1 :(得分:1)

最有效的方法是使用PreparedStatement

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

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