最近发生过H2数据库被锁定,项目启动不来的问题。
排查后发现是H2数据库当被打开时,都会创建一个锁定文件,以指示数据库正在使用的其他进程。如果关闭数据库,或者打开数据库的进程终止,则会删除此锁定文件。
而当java程序不是优雅关闭,直接kill掉java进程时,这个锁定文件没被删掉,下次启动项目就会报数据库被锁定。
查官网也提供了解决方案,改成socket锁定,不维护锁文件:
String url = "jdbc:h2:~/test;FILE_LOCK=SOCKET";
此外还有FILE,FS,NO等选项。其中NO是不锁数据库,但是有数据损坏风险。