由于我不会解释的原因(因为人们会把他们的回答指向另一个主题,而不是我手头的问题),我需要知道如何确定我的H2数据库是否被锁定。使用Java代码,我如何确定锁定文件是否存在于我的数据库中?
对于其他阅读此问题的人,我需要解释为什么你不应该自己,并让数据库自行检测是否锁定。首先,数据库文件锁定是一个实现细节,它可以而且将在数据库的未来版本中发生变化。然后,有一个竞赛条件:如果你看到锁现在不存在,它可能会在一秒钟后存在。因此,唯一可靠的方法是尝试锁定。所以:尝试以读写模式打开数据库。缺点:它有点慢,因为它将初始化数据库,并在需要时运行恢复代码。我知道这不是你想要的,因为它很慢(对吧?)。
对于较低级别的方法,这取决于您使用的H2版本。
1.4版(目前为测试版)
尝试使用以下代码锁定文件本身:
static boolean isLocked(String fileName) {
try {
RandomAccessFile f = new RandomAccessFile(fileName, "r");
try {
FileLock lock = f.getChannel().tryLock(0, Long.MAX_VALUE, true);
if (lock != null) {
lock.release();
return false;
}
} finally {
f.close();
}
} catch (IOException e) {
// ignore
}
return true;
}
或者使用H2代码(来自MVStore):
static boolean isLocked(String fileName) {
FileStore fs = new FileStore();
try {
fs.open(fileName, true, null);
return false;
} catch (IllegalStateException e) {
return true;
} finally {
fs.close();
}
}
禁用MVStore的1.3版(稳定版)和1.4版
仅仅检查文件<databaseName>.lock.db
是否存在是不够的。即使数据库没有打开,它也可能存在,以防进程被终止。所以一些样本代码(未测试)是:
// file name must be:
// path + databaseName + Constants.SUFFIX_LOCK_FILE
static boolean isLocked(String fileName) {
try {
FileLock lock = new FileLock(new TraceSystem(null), fileName, 1000);
lock.lock(FileLock.LOCK_FILE);
lock.unlock();
return false;
} catch (Exception e) {
return true;
}
}