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

时间:2014-03-31 01:46:10

标签: h2 embedded-database

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

save();
sleep(SLEEP_GAP);

FileLock.SLEEP_GAPstatic final int设置为25,因此根本无法调整(请不要建议我使用反射,如果您认为这样可行,我会#39; d鼓励你read this answer)。调用此方法并使主线程在每个INSERT语句上休眠25ms。如果你有成千上万的执行,它真的会浪费很多时间。为什么这个值设置为这样?有什么方法可以使用这个类吗?

Source code,如果您不想从SVN中获取它。

1 个答案:

答案 0 :(得分:1)

打开数据库文件时使用

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

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

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