java - 如何判断H2数据库文件锁是否存在?

标签 java database h2 filelock

由于我不会解释的原因(因为人们会将他们的 react 指向另一个主题,而不是我手头的问题),我需要知道如何确定我的 H2 数据库是否被锁定。使用Java代码,如何确定我的数据库中是否存在锁定文件?

最佳答案

对于阅读此问题的其他人,我需要解释为什么您不应该自己执行此操作,并让数据库自行检测是否已锁定。首先,数据库文件锁定是一个实现细节,在数据库的 future 版本中可能并且将会改变。然后,存在竞争条件:如果您看到锁现在不存在,那么一秒钟后它可能存在。所以唯一可靠的方法就是尝试锁定。所以:尝试以读写模式打开数据库。缺点:它有点慢,因为它将初始化数据库并在需要时运行恢复代码。我知道这不是您想要的,因为它很慢(对吗?)。

对于较低级别的方法,取决于您使用的 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();
    }
}

版本 1.3(稳定)和 1.4(禁用 MVStore)

简单地检查文件是否 <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;
    }
}

关于java - 如何判断H2数据库文件锁是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768760/

相关文章:

java - 是否可以覆盖通过导入的 BOM 默认管理的依赖项的范围而不覆盖版本?

java - 如何将完整的 H2 源代码包含到 Java 项目中?

php - 如何在 Laravel 4 中查询除一个以外的所有内容?

php - 如何用 PHP 创建库存管理

php - 使用嵌套集构建数据

java - 如何根据我的 SQuirrel 配置找到嵌入式 h2 数据库?

java - 为什么 IntelliJ 找不到正确的 WebServlet 类?

java - 我正在 Java 中处理静态变量和实例变量,我无法理解代码的输出

java - Hibernate:清理 session

java - AntiSamy 策略文件在 Web 项目中的位置