对于读这个问题的其他人,我需要解释为什么你不应该自己做,并让数据库自己检测它是否被锁定.首先,数据库文件锁定是一种实现细节,可以在将来的数据库版本中进行更改.然后,存在竞争条件:如果您现在看到锁不存在,则可能在一秒之后存在.所以唯一可靠的方法是尝试锁定.所以:尝试以读写模式打开数据库.缺点:它有点慢,因为它将初始化数据库并在需要时运行恢复代码.我明白这不是你想要的,因为它很慢(对吧?).
对于较低级别的方法,它取决于您使用的H2版本.
尝试使用以下代码锁定文件本身:
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;
}
Run Code Online (Sandbox Code Playgroud)
或使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
只是检查文件是否<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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2995 次 |
| 最近记录: |