h2 - 为什么 H2 DB FileLock.sleep() 需要花这么长时间?

标签 h2 embedded-database

今天早些时候我正在评估 H2 的速度,我注意到在进行许多后续查询时速度显着减慢。我使用 JMX 做了一个快速的 CPU 分析,我注意到绝大多数的 CPU 时间都花在了 FileLock.sleep() 方法上。我在执行数百个 INSERT 语句时调试了代码,这些调用几乎完全源于 FileLock.lockFile() 方法中的这一行:

save();
sleep(SLEEP_GAP);

FileLock.SLEEP_GAP 是一个 static final int 设置为 25,因此根本无法调整(请不要建议我使用反射,如果如果您认为这会起作用,我会鼓励您 read this answer )。在执行每个 INSERT 语句时,调用此方法并导致主线程休眠 25 毫秒。如果您有数以万计的任务需要执行,那么确实会浪费大量时间。为什么要这样设置这个值呢?有什么办法可以避免必须使用这个类吗?

Source code ,如果您不想将其从 SVN 中删除。

最佳答案

FileLock.sleep() 在打开数据库文件时使用,以确保没有其他进程可以同时打开同一个数据库文件(类似于文件锁定)。大多数数据库引擎都使用这种机制。如果您在分析中看到这一点,则意味着数据库连续打开和关闭多次。打开和关闭数据库非常慢,应该避免。

如果可能,数据库应保持打开状态,by keeping the connection open or by using a connection pool .

如果这不是一个选项,则附加 ;DB_CLOSE_DELAY=1到数据库 URL。这将使数据库文件在关闭最后一个连接后保持打开状态一秒钟。

关于h2 - 为什么 H2 DB FileLock.sleep() 需要花这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752397/

相关文章:

H2 数据库控制台 spring boot 加载被 X-Frame-Options 拒绝

database - H2:如何设置默认模式和数据库?

sql - H2 - 如何截断所有表?

oracle - 用于集成测试的嵌入式或托管 Oracle 实例

sql - H2 与 PostgreSQL 生成的带有函数的列

mysql - 在最小化冗余方面,像 MySQL 和 H2 这样的数据库有多聪明?

Java 嵌入式数据库比较

database - 您可以推荐哪种支持独立存储的嵌入式数据库?

java - 'getRow()' 方法只允许在滚动游标上 SQLException 错误

c# - 如何在嵌入式模式下运行 RavenDb?