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

1.设置 LOCK_TIMEOUT

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

2.MULTI_THREADED = FALSE

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

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

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

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

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

H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。