今天第二次遇到 HSQLDB 死鎖的問題,又搜索了一遍解決方案,雖然解決方法很簡單,但是非常有必要記錄下來。本篇不深究原因,只給出解決方案。
問題描述
在測試代碼中使用 HSQLDB 內存數據庫時,數據庫執行某 SQL 時卡住不動(或者你看不出來和執行 SQL 有關)。
此時導出線程堆棧可以看到類似下面的堆棧信息:
解決辦法
HSQLDB 支持三種鎖設置:SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC }
,分別爲 LOCKS | MVLOCKS | MVCC
,默認值爲 LOCKS
。
關於鎖的詳細介紹看這裏:http://hsqldb.org/doc/2.0/guide/sessions-chapt.html
解決方法 1
在內存數據庫執行 SQL,先執行 SET DATABASE TRANSACTION CONTROL MVCC
,設置爲 MVCC
模式即可。
解決辦法 2
DriverManager.getConnection(String url,Properties info);
在 Properties
中設置如下屬性和值:
info.setProperty("hsqldb.tx", "mvcc");
解決辦法 3
JDBC URL 參數方式: jdbc:hsqldb:mem:test;hsqldb.tx=mvcc
。
解決辦法 4
使用 server.properties
配置的情況下:
hsqldb.tx=mvcc
有關 hsqldb.tx
屬性的詳細信息可以參考這裏:http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html