H2语句池

时间:2014-12-22 07:33:15

标签: java jdbc h2

使用准备好的陈述的原因有两个:

  1. 通过仅作为参数添加来自外部世界的数据来防止SQL注入。
  2. 通过让DB预先解析语句一次并通过传递参数重复使用它来提高性能。
  3. 但JDBC中的预处理语句与连接相关联。我们应该使用连接池。这意味着在一个典型的代码示例中我必须

    • 从池中获取连接
    • (重新) - 每次创建准备好的陈述,因为没有其他合理的方法可以让它回来

    当使用JdbcConnectionPool,H2附带的简单连接池时,我认为语句不会被缓存。这是否意味着在使用准备好的陈述时会对绩效产生负面影响 - 由于上述(1),我无法避免这种影响。

1 个答案:

答案 0 :(得分:2)

H2在连接级别透明地缓存预准备语句。这意味着,只要在创建预准备语句时SQL字符串相同并且您使用相同的连接就不会重新解析,而只是将其作为缓存查找的不透明字符串进行比较(请参阅org.h2.jdbc.JdbcConnection#prepareCommand(...))。

您可以使用参数QUERY_CACHE_SIZE配置查询缓存大小 - 更多信息here

根据您的使用情况,您可能希望尝试根本不使用连接池。例如。作为嵌入式数据库,您实际上并没有很高的连接成本。当仅使用单个连接时,您可能会获得更大的性能提升(更多缓存命中率;更低的内存消耗,因为您不会复制缓存)。此外,H2的许多部分都不是真正为并发而构建的(AFAIK)。

所以回答你的问题:

不,我认为这不会对准备好的声明表现产生负面影响。相反。

但是,请考虑您想要使用哪种池以及您希望它有多大。另外,您期望什么样的并发性?然后在您希望在实时应用程序中看到的那种场景中测量速度和内存消耗。并且......想一想这对您的应用程序有多重要。我怀疑在其他地方可能有更大的鱼。