H2报‘Timeout trying to lock table "SYS"; ’解决方案

  |   0 评论   |   1,881 浏览

H2在内存模式下为数据量较大的表创建索引时,偶尔会报出
Timeout trying to lock table "SYS"
的错误,这事我研究了挺长时间,以前一直觉得是应用程序关闭的时候没有完全关闭掉h2导致一直有表被锁着,总结了一下发现只有在为数据量大的表建索引的时候才会出现这样的情况,于是乎就从“是不是是并行处理很大数据量较大表的索引时才会导致锁住'SYS'并引起超时的问题的”的方向排查问题。查阅官方的文档,然后又科学上网等等方式发现了两个解决方案。

1.设置LOCK_TIMEOUT

在大表不是很多的情况下,可以通过配置超时时间的方式等SYS被释放。但是这个吧有点治标不治本的意思。加入大表很多,设置的时间就是个问题,如果时间设置的不合理,那还是会引发Timeout trying to lock table "SYS的问题,要么就是要等好久。多多少少有点low.
image.png

2.MULTI_THREADED = FALSE

这个也有点low,把H2的多线程模式关闭。性能上包括sql执行的时候肯定是会有所下降的。
image.png

我还会继续寻找更优的解决办法。

------------------------------我是分隔线---------------------------

找到了一个更优的解决方案

之前h2参数配置是通过配置文件的方式配置的如下:
jdbc:h2:mem:riskdb;CACHE_SIZE=1048576;CACHE_TYPE=SOFT_LRU;MULTI_THREADED=FALSE;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE
新的方案就是这些配置全部转移到代码层面去做。
数据在加载以及创建索引的时候关闭多线程
数据加载完毕的时候动态开启多线程配置

这个家伙很懒,连签名都不写。

评论

发表评论