Jena 为什么是TDB2;“锁已被持有”;jar文件出现问题?

Jena 为什么是TDB2;“锁已被持有”;jar文件出现问题?,jena,tdb,Jena,Tdb,我正在开发一个ApacheJena应用程序。当我从Intellij IDE运行代码时,它工作得很好,但是如果我生成一个jar文件并在终端中运行jar文件,它就不工作了 我得到的错误是: Uncaught exeption ! : org.apache.jena.dboe.base.file.AlreadyLocked: Failed to get a lock: file='/home/iam/OneDrive/Internship/current_data/myTDB/tdb.lock': L

我正在开发一个ApacheJena应用程序。当我从Intellij IDE运行代码时,它工作得很好,但是如果我生成一个jar文件并在终端中运行jar文件,它就不工作了

我得到的错误是:

Uncaught exeption ! : org.apache.jena.dboe.base.file.AlreadyLocked: Failed to get a lock: file='/home/iam/OneDrive/Internship/current_data/myTDB/tdb.lock': Lock already held
我正在使用:

  • ApacheJena(3.15.0)。(TDB2)
  • 梯度6.5
  • JVM:11.0.8(Ubuntu 11.0.8+10-post-Ubuntu-0ubuntu120.04)
TDB特定锁定问题 我首先要提到的是:

此异常是TDBs自动多JVM使用预防的结果,如前所述,我可以在多个应用程序之间共享TDB数据集吗?问题TDB数据库只能由单个JVM安全使用,否则可能会发生数据损坏。从1.1.0开始,TDB会在可能的情况下自动执行此限制,如果您试图访问从另一个JVM访问的数据库,则会出现此异常

基本上,您不能同时从两个进程打开相同的TDB数据库位置

至于在您的具体案例中出现的情况:

  • 您可以从访问TDB数据库的IntelliJ内部运行一些代码。这将创建锁文件,假设IntelliJ没有派生新的JVM,那么锁文件将与IntelliJ进程本身关联。
    或者,如果IntelliJ正在进行新流程的分叉,那么您/它不是 完成后显式停止正在运行的进程
  • 然后尝试运行构建的JAR文件。这会尝试打开TDB数据库,看到锁文件存在,并指向活动IntelliJ进程,因此拒绝访问数据库
  • 您很可能需要先退出并重新启动IntelliJ,因为该进程(或子进程)将是锁持有者。然后,您需要确保从IntelliJ内部运行的任何代码都是作为一个新进程生成的,并且每当您想单独测试构建的JAR时,都要停止该进程

    另一种可能的方法是使TDB数据库位置可配置,以便在IntelliJ中测试时使用不同的位置,而不是在运行JAR文件时使用不同的位置。这样就避免了两个进程争夺数据库锁的可能性,因为它们将使用单独的数据库

    特定于文件系统的锁定问题 我还注意到,您的数据库似乎位于OneDrive位置-
    /home/iam/OneDrive/interporation/current\u data/myTDB/tdb.lock
    -这里也可能发生文件系统问题

  • 由于OneDrive不一定在本地存储所有文件,因此用于将其装载到系统上的文件系统实际上可能不支持锁定该位置。虽然您的代码在IntelliJ内部运行的事实似乎表明情况并非如此。不过,您可以尝试使用肯定位于本地驱动器上的数据库位置来排除这种情况
  • 该位置正被其他进程隐式锁定(可能是OneDrive本身,也可能是IntelliJ,或者完全其他进程)

  • 对于2,这似乎是您案例中更可能出现的问题,您可以尝试找出锁定的原因,例如,找出锁定它的其他流程,并进行进一步调查。

    您好,谢谢您的回答。只是想让您知道,在运行JAR文件之前,我试图停止Intellij并重新启动计算机。还要更改JAR文件的数据库位置。尽管如此,我仍然面临着这个问题。@MD.SHAHRIARHASSAN补充了一些想法,尽管最终这将取决于您调查谁/什么人持有该位置的锁,并据此解决问题。阅读您的答案后,我了解了它的主要工作原理。我调试了应用程序,发现有多个线程试图访问同一个数据库。谢谢。一个进程中的多个线程可以,但多个进程不行