首页
学习
活动
专区
圈层
工具
发布

H2语句池
EN

Stack Overflow用户
提问于 2014-12-22 07:33:14
回答 1查看 952关注 0票数 0

使用准备好的语句的理由有两个:

  1. 通过仅作为参数添加来自外部世界的数据来防止SQL注入。
  2. 通过让DB预解析语句一次,并通过传递参数多次重用它,从而提高性能。

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

  • 从池中获取连接
  • (Re)每次-create准备好的语句,因为没有其他合理的方法将它拿回来

在使用JdbcConnectionPool ( H2附带的简单连接池)时,我认为语句没有缓存。这是否意味着在使用预先准备的语句时会对性能产生相当负面的影响--由于上文(1)的原因,这一点我无法避免。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-22 09:54:42

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

可以使用参数QUERY_CACHE_SIZE-more info 这里配置查询缓存大小。

根据您的使用场景,您可能希望尝试完全不使用连接池。例如,作为嵌入式数据库,连接成本并不高。如果只使用单个连接(缓存次数越多;内存消耗越低,因为不重复缓存),您可能会获得更高的性能。而且,H2的许多部分(AFAIK)并不是真正为并发构建的。

因此,要回答你的问题:

不,我不认为这本身对准备好的陈述表现有负面影响。恰恰相反。

然而,想想你想要使用什么样的池,以及你希望它有多大。另外,您期望什么样的并发性?然后,在您期望在实际应用程序中看到的场景中,测量速度和内存消耗。还有..。考虑一下这对您的应用程序到底有多重要。我想其他地方可能还有更大的鱼要炸掉。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27598390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档