JDBC – Statement,PreparedStatement,CallableStatement和缓存
我想知道有什么区别以及何时使用Statement
, PreparedStatement
和CallableStatement
。
使用这些方法的最佳实践和典型方案是什么?
声明与PreparedStatement
-
PreparedStatement可以提高性能,但与数据库有关。
-
使用PreparedStatement可以避免SQL注入。 PreparedStatement如何避免或阻止SQL注入?
-
使用setInt更好地检查prepareStatement,setString where where语句,你只是继续附加到主SQL。
类似post:
Statement和PreparedStatement之间的区别
CallableStatement – 跨所有数据库访问StoredProcedures的Java答案。
类似的post
CallableStatement vs Statement
使用PreparedStatement和Callable你已经有了缓存,缓存也是一个很大的话题,你不想做所有这些而是看看ehcache
您应该几乎总是更喜欢PreparedStatement而不是Statement
如果你必须在StoredProcedure上操作,你只有一个选项CallableStatement。
无论你是否会重复使用该语句,我建议你在传递参数的任何时候使用PreparedStatement。 在实践中,我将PreparedStatement用于除过程调用之外的所有内容,并让DB和JDBC驱动程序决定要缓存的内容以及如何缓存。 过程调用应使用CallableStatement来处理缺少一致的跨数据库过程调用语法。
在PostgreSQL上,JDBC驱动程序在客户端缓存预准备语句,直到达到某个重用阈值。 此时,将发出服务器端PREPARE,并且将来的执行将使用服务器端预处理语句及其缓存计划。 由于PostgreSQL基于统计的查询规划器,这可能有一些……有趣……以及意想不到的效果。 如果您的表具有某些值分布(或由于缺少ANALYZE,错误的random_page_cost或太低的统计阈值)而导致统计信息错误,那么当计划程序具有未知参数时,可能会选择不同且较慢的查询计划。它知道你要搜索的实际价值。 如果您在第5次(默认情况下)重复某个特定语句后遇到查询突然大幅减速,您可能会被此类操作所困扰,并且可以通过关闭 PgJDBC中的服务器端PREPARE来解决此问题。 通过检查特定参数是否与未知值情况具有非常不同的统计数据,正在进行检测服务器中的这些问题情况的工作正在进行中,但AFAIK尚未点击HEAD。 另见这个问题 。 搜索pgsql-general邮件列表和stackOverflow以获取更多信息。