今天早些时候我正在评估 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/