【问题标题】:H2 database error: Database may be already in use: "Locked by another process"H2 数据库错误:数据库可能已在使用中:“被另一个进程锁定”
【发布时间】:2011-12-30 19:59:10
【问题描述】:

我正在尝试从 Java 应用程序中使用 H2 数据库。

我通过 H2 控制台创建了数据库及其表,然后尝试使用 Java 连接

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");

但是我收到以下错误:

线程“主”org.h2.jdbc.JdbcSQLException 中的异常:数据库可能已在使用中:“被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-161]

我试图删除dbname.lock.db 文件,但它会自动重新创建。

如何解锁数据库以从我的 Java 程序中使用它?

【问题讨论】:

    标签: java database h2


    【解决方案1】:

    在您的 application.properties 文件中 > 将数据源编辑为:

    spring.datasource.url=jdbc:h2:file:C:/temp/test;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
    

    编码愉快!

    【讨论】:

      【解决方案2】:

      如果您将同一个应用程序运行到多个端口,其中应用程序使用单个数据库 (h2),请在 url 中添加AUTO_SERVER=TRUE,如下所示:

      jdbc:h2:file:C:/simple-commerce/price;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;AUTO_SERVER=TRUE
      

      【讨论】:

        【解决方案3】:

        对于 InteliJ:在数据库视图中右键单击您的数据库并选择“断开连接”。

        【讨论】:

          【解决方案4】:

          我在 eclipse 中遇到了这个问题。我所做的是,从任务管理器中杀死正在运行的 java 进程。

          它对我有用。

          【讨论】:

            【解决方案5】:

            此问题的答案 => 线程“主”org.h2.jdbc.JdbcSQLException 中的异常:数据库可能已在使用中:“被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-161]

            从您的浏览器中关闭所有打开 h2 数据库的选项卡也从您的电脑退出 h2 引擎

            【讨论】:

              【解决方案6】:

              我从上面的 Saman Salehi 那里得到了线索。 我的用例: 为客户端负载平衡准备 REST 应用程序(运行 REST 的两个 JVM 实例)。在这里,我的 MVC 应用程序将调用这个具有 ActiveMQ 后端数据的 REST 应用程序。 当我在 Eclipse 中运行两个 REST 应用程序实例并尝试使用以下配置同时运行两个实例时遇到问题

              spring.datasource.url=jdbc:h2:file:./Database;
              spring.jpa.properties.hibernate.hbm2ddl.auto=update
              

              添加后 DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

              spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
              

              两个实例都在 Eureka 仪表板中运行并显示。

              VM退出时不要关闭数据库:jdbc:h2:;DB_CLOSE_ON_EXIT=FALSE

              多个进程可以访问同一个数据库,无需手动启动服务器;AUTO_SERVER=TRUE

              进一步阅读: http://www.h2database.com/html/features.html

              【讨论】:

              • 在我的 url jdbc:h2:file:~/trash/mydb;mode=PostgreSQL;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE 中使用这些标志,我可以在两个 Java 应用程序之间共享基于相同文件的实例,甚至可以使用 Web 浏览器控制台。
              【解决方案7】:

              你也可以删除h2文件数据库的文件,问题就会消失。

              jdbc:h2:~/dbname 表示将在用户主目录中创建名为 db name 的文件 h2 数据库(~/ 表示用户主目录,希望你在 Linux 上工作)。

              在我的本地机器中,它存在于:/home/jack/dbname.mv.db 我不知道为什么文件的名称是 dbname.mv.db 而不是 dbname。 可能是它的 h2 默认设置。 我删除了这个文件:

              rm ~/dbname.mv.db 
              

              或:

              cd ~/ 
              rm dbname.mv.db 
              

              数据库 dbname 将与所有数据一起删除。新数据库初始化后一切正常。

              【讨论】:

                【解决方案8】:

                我遇到了同样的问题。 在 Intellj 中,当我想在程序运行时使用 h2 数据库时,我遇到了同样的错误。 为了解决这个问题,我改变了连接 url 从

                spring.datasource.url=jdbc:h2:file:~/ipinbarbot
                

                到:

                spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
                

                然后我的问题就消失了。现在我可以在我的程序运行时连接到“ipinbarbot”数据库。 如果你使用 Hibernate,也别忘了拥有:

                spring.jpa.hibernate.ddl-auto = update
                

                祝你好运

                【讨论】:

                • 谢谢,Saman,它帮助了我……我也在这里写了我的用例。
                【解决方案9】:

                简单步骤:进入任务管理器,杀死java进程

                然后开始你的应用程序

                【讨论】:

                • 最快修复。谢谢。
                【解决方案10】:

                遇到了类似的问题,我的解决方案是在具有关联锁的文件上运行 fuser -k 'filename.db'

                希望这会有所帮助!

                【讨论】:

                  【解决方案11】:

                  我在 Web 应用程序中使用 ORMLite 运行时遇到了类似的问题。我最初被困在在 url 中使用服务器模式的语法上。上面的答案对此有所帮助。然后我遇到了类似的用户/密码错误,更容易弄清楚。我不必关闭任何东西或删除任何文件。以下代码有效:

                  protected ConnectionSource getConnectionSource() throws SQLException {
                      String databaseUrl = "jdbc:h2:tcp://localhost/~/test";
                      return new JdbcConnectionSource(databaseUrl,"sa","sa");
                  }
                  

                  为了在wildfly的服务器模式下使用H2,我在standalone.xml中修改了connection-url

                  <datasource jndi-name="java:jboss/datasources/ExampleDS" pool- name="ExampleDS" enabled="true" use-java-context="true">
                       <connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
                                 …
                  </datasource>
                  

                  【讨论】:

                    【解决方案12】:

                    我正在将 h2db 与测试 T24 tafj 应用程序一起使用,我遇到了同样的问题,但我设法通过识别正在运行 h2 的应用程序来解决它(在我尝试设置数据库连接时启动)。

                    ps aux|grep java
                    

                    将输出为:

                    sysadmin 22755  3.2  0.1 5189724 64008 pts/3   Sl   08:28   0:00 /usr/java/default/bin/java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data
                    

                    现在用它的进程 ID 杀死它:

                    kill -9 22755
                    

                    最后删除锁定文件:

                    rm -f dbname.lock.db
                    

                    【讨论】:

                    • 完美运行。但我不必删除锁定的文件。只需终止进程即可。
                    【解决方案13】:

                    您还可以从 H2 控制台访问“首选项”选项卡,并通过按关闭按钮关闭所有活动会话。

                    【讨论】:

                    • 这是正确的。简单的答案是注销数据库并关闭服务器。请参阅 H2 教程中的断开和停止应用程序。
                    【解决方案14】:

                    H2 仍在运行(我可以保证)。您需要为多个用户使用 TCP 连接,例如 ->

                    <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>
                    

                    DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");
                    

                    这也意味着您需要以 TCP 模式启动服务器。老实说,这在文档中非常简单。

                    强制终止进程(Windows 为 javaw.exe),并确保关闭任何可能启动它的应用程序。您有一个活动锁。

                    【讨论】:

                    • 附注——除非它是一个真正孤立的应用程序,否则我真的建议使用 TCP/IP 模式。当用户不小心打开两个实例时,它解决了这个确切的问题。
                    • 感谢您的回答。我试图使用嵌入模式,因为根据文档它更快。
                    • @Vasilis 它要快得多。你只是以你很容易遇到的情况而告终。您可能会考虑一个框架,您可以在其中启动数据库并从应用程序内优雅地停止它,从而避免您发现自己所处的情况。祝您好运,它是小型数据集的绝佳数据库。
                    • 对于当前的 H2,上面的 DriverManager 示例会产生异常 A file path that is implicitly relative to the current working directory is not allowed in the database URL。相反,如果您将server~ 替换为~,它似乎可以正常工作。
                    猜你喜欢
                    • 1970-01-01
                    • 2015-07-07
                    • 2022-08-07
                    • 2015-02-22
                    • 1970-01-01
                    • 2013-04-18
                    • 1970-01-01
                    • 2012-02-09
                    • 2018-06-11
                    相关资源
                    最近更新 更多