java - H2语句池

标签 java jdbc h2

使用准备好的语句的原因有两个:

  1. 通过仅添加来自外部的数据作为参数来防止 SQL 注入(inject)。
  2. 让数据库预先解析一次语句,然后仅传递参数即可多次重复使用它,从而提高性能。

但是 JDBC 中的预准备语句与连接绑定(bind)在一起。我们应该使用连接池。这意味着在典型的代码示例中我必须

  • 从池中获取连接
  • (重新)-每次都创建准备好的语句,因为没有其他明智的方法可以将其恢复

当使用H2自带的简单连接池JdbcConnectionPool时,我认为语句没有被缓存。这是否意味着使用准备好的语句时会对性能产生相当负面的影响——由于上面的(1),我无法真正避免这种影响。

最佳答案

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

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

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

所以回答你的问题:

不,我认为这本身不会对准备好的语句性能产生负面影响。恰恰相反。

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

关于java - H2语句池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598390/

相关文章:

Java 位图 RGB 操作

java - 如何通过断言失败

java - jdbc 与 java、单例连接对象或 spring jdbc 连接的连接?

java - 从类路径打开 H2 数据库

java - 为什么 H2 不需要 JDBC 驱动程序

java - 使目录可访问以通过 url 获取其中的文件

java - 来自 url 的 MediaPlayer 流

java - 为 Java 8 重建 JRE7 jdbc-odbc 桥

java - 在 WHERE 子句和 LIKE 中连接 3 列是否可以实现?

mysql - 无法在 h2 数据库中的 Round(value,2) 中正确显示两个小数