gpt4 book ai didi

java - H2语句池

转载 作者:行者123 更新时间:2023-12-02 05:08:02 25 4
gpt4 key购买 nike

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

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com