2011-06-14 96 views
7

何时使用语句而不是准备语句。我认为语句用于没有参数的查询,但为什么不使用预准备语句?对于没有参数的查询,哪一个更快。何时使用Statement over Prepared Statement?

+4

有几乎没有一个理由使用正常的语句,可能除了DDL语句和其他PARAM少发言。 – 2011-06-14 13:00:37

+1

[Statement and PreparedStatement之间的差异]的可能重复(http://stackoverflow.com/questions/3271249/difference-between-statement-and-preparedstatement) – BalusC 2011-06-14 13:03:58

回答

9

我想声明用于没有参数的查询,但为什么不使用预处理语句?

这甚至没有接近。 PreparedStatements用于返回ResultSet或更新计数的INSERT,UPDATE和DELETE语句。他们不会像Joachim指出的那样为DDL语句工作,他们也不会用于调用需要CallableStatement的存储过程(这不是两个类之间的区别)。就没有绑定参数的查询而言,PreparedStatements可能比Statements更好(见下文)。

对于没有参数的查询,哪一个更快。

从长远来看,PreparedStatements在单个连接的扩展使用中将变得更快。这是因为,尽管PreparedStatements必须被编译,这需要一些时间(这实际上并不是很多,所以不要将其看作是缺点),编译后的版本本质上持有对SQL执行计划的引用数据库。一旦编译完成,PreparedStatement就会存储在一个连接专用的缓存中,这样编译后的版本可以被重用以提高性能。如果您正在使用JDBC批处理操作,则使用PreparedStatements将使批处理的执行速度比使用简单Statement对象的速度快得多,如果数据库必须这样做,可能需要一次又一次准备计划。

+0

FYI,*典型查询的大部分工作都在语句的解析,而不是数据检索。如果多次使用相同的语句,PreparedStatements会快很多。 – Bohemian 2011-06-14 13:17:22

+0

是的,那就是当你在一个execute,executeUpdate或executeQuery调用的解析和执行之间进行比较时。针对大量使用的数据库,如果您有足够大的语句缓存,则预编译语句本质上可以为您提供跨多个调用的性能增益。 – 2011-06-14 13:22:49

4

这取决于您的要求。

如果您有一条SQL语句以循环方式运行或频繁使用不同的参数,那么PreparedStatement是最好的选择,因为它正在进行预编译并缓存此参数化SQL查询的执行计划。每次它从相同的PreparedStatement对象运行时,它将使用缓存执行计划并提供更好的性能。

也可以使用PreparedStatement避免SQL注入。

但是,如果您确定只运行一次SQL查询,有时Statement将成为自创建PreparedStatement对象以来的最佳人选,有时它会进行额外的db调用,如果驱动程序支持预编译,则方法Connection.prepareStatement(java.lang.String)将发送语句到数据库进行预编译。

阅读下面文章,了解“声明对战PreparedStatement的”

相关问题