当前位置: 首页 > 知识库问答 >
问题:

H2语句池

姬欣怡
2023-03-14

使用准备好的报表的原因有两个:

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

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

  • 从池中获取连接

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

共有1个答案

宦正诚
2023-03-14

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

您可以使用参数query\u cache\u size配置查询缓存大小-此处有更多信息。

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

所以要回答你的问题:

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

但是,想想你想用什么样的池子,你想让它有多大。还有,你期望什么样的并发?然后在您期望在实时应用程序中看到的场景中测量速度和内存消耗。和...想想这对你的申请有多重要。我怀疑其他地方可能有更大的麻烦。

 类似资料:
  • 我正在尝试使用准备好的语句和TABLE_CATALOG和table_schema的参数来选择默认模式'public'中的所有表。当我创建一个准备好的语句时,系统会返回一个错误,这没有任何意义。如果我指定了TABLE_CATALOG而不指定TABLE_SCHEMA,它可以很好地工作。另外,如果指定TABLE_SCHEMA而不指定TABLE_CATALOG,它也可以正常工作。我是不是做错什么了? 线程

  • 我从Spring Boot进行了升级 它创建序列,但不创建任何表。查看跟踪,它显示了创建表中的语法错误 SQL:SQL 语句中的语法错误(一个示例): 事实上,检查qith H2控制台或SQl linter它将“IDENTITY[*]”标记为错误,否则它将在H2中工作。 第二次尝试也是失败的。我把 并将Spring文档 https://docs.spring.io/spring-batch/doc

  • 问题内容: 我正在尝试为H2导入一个SQL脚本。该脚本由spring- batch提供,用于存储作业元数据。当我直接在H2控制台中执行此脚本时,没有语法错误,但是我在初始化阶段引用了Hibernate / JPA中要导入的相同脚本,却遇到了以下异常: 这是我要执行的脚本:https : //code.google.com/p/joshlong- examples/source/browse/tru

  •  语句和语句块是 TJS2 语法中非常重要的元素。 语句  一个语句以 ; (分号) 结束。可以是表达式后直接加分号,也可以是 if 等控制语句后加分号。 例: a++; func1(); returna+b; 等等…… 语句块  语句块由多个语句组成,用{ }括起来表示。语句块中的语句按由上至下的顺序执行。 例: { a++; b++; } { vart=func1(); func2(t); b

  • 本页包含内容: 循环语句 分支语句 带标签的语句 控制传递语句 在 Swift 中,有两种类型的语句:简单语句和控制流语句。简单语句是最常见的,用于构造表达式和声明。控制流语句则用于控制程序执行的流程,Swift 中有三种类型的控制流语句:循环语句、分支语句和控制传递语句。 循环语句用于重复执行代码块;分支语句用于执行满足特定条件的代码块;控制传递语句则用于修改代码的执行顺序。在稍后的叙述中,将会

  • 语句 条件控制语句 其中expression可以使用整型,字符串,甚至表达式 if (expression0) {statement0} else if (expression1) {statement1} else {statement2} // JavaScript 中的 case 可以使用整型,字符串,甚至表达式 switch(persion.type) { case "teacher