Java JDBC-语句、PreparedStatement、CallableStatement和缓存

Java JDBC-语句、PreparedStatement、CallableStatement和缓存,java,mysql,sql,postgresql,jdbc,Java,Mysql,Sql,Postgresql,Jdbc,我想知道它们的区别是什么,以及何时使用语句,预处理语句,以及可调用语句 使用这些语句的最佳实践和典型场景是什么?语句与PreparedStatement PreparedStatement的性能可能更好,但依赖于数据库 使用PreparedStatement可以避免SQL注入 通过setInt使用preparedStatement进行更好的类型检查,setString where as语句只是一直附加到主SQL 类似职位: CallableStatement—跨所有数据库访问StoredPro

我想知道它们的区别是什么,以及何时使用
语句
预处理语句
,以及
可调用语句


使用这些语句的最佳实践和典型场景是什么?

语句与PreparedStatement

  • PreparedStatement的性能可能更好,但依赖于数据库

  • 使用PreparedStatement可以避免SQL注入

  • 通过setInt使用preparedStatement进行更好的类型检查,setString where as语句只是一直附加到主SQL

  • 类似职位:

    CallableStatement—跨所有数据库访问StoredProcess的Java应答

    类似职位


    有了PreparedStatement和Callable,您已经有了缓存,而且缓存本身也是一个大主题,您不想做所有这些,而是想看看

    您几乎应该总是选择PreparedStatement而不是Statement


    如果您必须在StoredProcedure上操作,那么您只有一个选项CallableStatement。

    我建议您在传递参数的任何时候都使用PreparedStatement,无论是否重新使用该语句。实际上,除了过程调用之外,我使用PreparedStatement,让DB和JDBC驱动程序决定缓存什么以及如何缓存。过程调用应该使用CallableStatement来处理缺乏一致的跨数据库过程调用语法的问题


    在PostgreSQL上,JDBC驱动程序在客户端缓存准备好的语句,直到达到某个重用阈值。此时将发出服务器端PREPARE,未来的执行将使用服务器端prepared语句及其缓存计划。这可以有一些。。。有趣的。。。由于PostgreSQL基于统计信息的查询计划器,会产生意想不到的影响。如果您的表具有特定的值分布(或由于缺乏分析、错误的随机页面成本或过低的统计阈值而导致的统计数据不好),则当计划员在已知您搜索的实际值的情况下,如果其具有未知参数,则可能会选择不同且较慢的查询计划。如果在第五次(默认情况下)重复某个特定语句之后,查询速度突然大幅下降,您可能会受到影响,可以通过PgJDBC解决这个问题。目前正在进行的工作是通过检查特定参数是否具有与未知值情况非常不同的统计信息来检测服务器中的这些问题情况,但很抱歉,它还没有击中头部。另见。有关详细信息,请搜索pgsql常规邮件列表和stackOverflow。

    “使用PreparedStatement和Callable,您已经有了缓存”。是这样吗?据我所知,缓存仅用于SQL执行计划。这些结构不会缓存查询结果。