2. 数据库连接失败:Derby 锁文件与实例路径排查
Derby 锁与实例路径的排查逻辑
OpenLCA 的数据库基于 Apache Derby 嵌入式引擎,每个数据库实例在运行时会生成 db.lck 锁文件,并在 service.properties 中记录实例标识。当 OpenLCA 异常退出、进程残留或数据库目录被复制到另一台机器后,锁文件可能未被清除,导致再次打开时提示“数据库被占用”或“无法打开数据库”。排查的核心是区分三种情况:锁文件残留、目录权限不足、实例路径配置错误。
锁文件残留的判定与清除
Derby 的锁文件位于数据库目录根部,文件名固定为 db.lck。它记录当前持有数据库的进程信息。正常关闭 OpenLCA 时该文件会被自动删除;若程序崩溃、强制结束进程或断电,锁文件会残留。判定要点:
- 先确认 OpenLCA 进程已完全退出(Windows 任务管理器 / Linux
ps aux | grep openlca),排除“进程仍在后台占用”的假象。 - 查看
db.lck的修改时间,若远早于当前时间且无对应进程,基本可判定为残留。 - 删除前建议先备份整个数据库目录,再删除
db.lck,重新启动 OpenLCA 打开数据库。
切勿在 OpenLCA 正在运行时删除
db.lck,否则可能造成数据库损坏。删除操作必须建立在“进程已退出”的前提上。目录权限与实例路径核对
若数据库目录不存在锁文件但仍无法打开,应检查目录权限。Derby 需要对数据库目录及其子目录具备读写权限,且不能位于只读介质或某些云同步目录(同步客户端可能锁定文件)。在 Linux/macOS 下可用 ls -l 查看属主与权限位,必要时用 chmod -R u+rw 修正;Windows 下检查文件夹“属性→安全”中当前用户是否具备“修改”权限。
实例路径配置错误常见于:数据库目录被移动或复制到新位置后,OpenLCA 仍指向旧路径;或复制时遗漏了 service.properties。正确做法是复制整个数据库文件夹(包含 service.properties、seg0 等子目录),然后在 OpenLCA 的数据库管理界面重新指定路径并打开。若 service.properties 中的实例标识与目录不匹配,Derby 会拒绝启动,此时应使用完整复制而非仅复制部分文件。
排查操作清单
| 检查项 | 操作 | 通过判据 |
|---|---|---|
| 进程状态 | 确认 OpenLCA 无残留进程 | 任务管理器/ps 中无 openlca 进程 |
| 锁文件 | 查看并删除残留 db.lck | 删除后重新打开不再提示占用 |
| 目录权限 | 检查并修正读写权限 | 当前用户可创建/删除文件 |
| 实例路径 | 核对 databases 路径与 service.properties | 路径一致且文件完整 |
| 迁移验证 | 完整复制目录后重新指定路径打开 | 数据库正常加载,无报错 |
若删除锁文件后问题依旧,优先怀疑目录权限或路径配置,而不是反复删除锁文件。锁文件只是表象,根因往往在权限或路径。