【问题标题】:Database lock acquisition failure and hsqldb数据库锁获取失败和hsqldb
【发布时间】:2011-04-27 11:37:22
【问题描述】:

我试图连接到一个 hsql 数据库。我通过从 C:\myhsql:

运行创建了一个
java -cp .;C:\hsql\lib\hsqldb.jar org.hsqldb.Server -database.0 file:db\mydb -dbname.0 MYDB

这在名为db 的目录中创建了mydb。此文件夹现在有一个名为 mydb 的 .lck、tmp、script、properties 文件,以及当前文件夹中名为 MYDB 的类似文件。

在我尝试过的java代码中

Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:file:db/sjdb", "SA", "");

当我运行程序时,我收到了这个错误:

java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\mydb.lc
k, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
...

这是堆栈跟踪:

java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\sjdb.lc
k, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source)
        at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
        at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at ConnectHSQLDB.main(ConnectHSQLDB.java:20)
Caused by: org.hsqldb.HsqlException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\sjdb.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.persist.LockFile.newLockFileLock(Unknown Source)
        at org.hsqldb.persist.Logger.acquireLock(Unknown Source)
        at org.hsqldb.persist.Logger.openPersistence(Unknown Source)
        at org.hsqldb.Database.reopen(Unknown Source)
        at org.hsqldb.Database.open(Unknown Source)
        at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
        at org.hsqldb.DatabaseManager.newSession(Unknown Source)
        ... 6 more
java.lang.NullPointerException
        at ConnectHSQLDB.main(ConnectHSQLDB.java:32)

谁能告诉我我做错了什么?我可以使用 SwingDBManager 连接到数据库,并且可以在数据库中记录 insertdeleteselect。当我尝试 java 代码时,我没有运行 DBManager。仍然发生锁定问题。

【问题讨论】:

    标签: hsqldb


    【解决方案1】:

    第一个命令启动一个服务器。此服务器锁定数据库文件,使“其他人”无法修改它们。您应该使用“-dbname.0 mydb”而不是“MYDB”,因为它应该是小写的。

    您用于连接数据库的 Java 连接 URL 错误。您应该使用“jdbc:hsqldb:hsql://localhost/mydb”作为连接字符串。当数据库文件被服务器锁定时,您可以访问数据库服务器,但不能使用文件“进程中”访问数据库:URL。

    【讨论】:

      【解决方案2】:

      我遇到这个错误是因为我想在另一个客户端(例如IntelliJ database)中查看当前打开的数据库,而服务器正在使用相同的数据库

      所以要使hsql db能够连接到多个客户端,请使用

      hsqldb.lock_file=false
      

      所以连接 url 会像

      jdbc:hsqldb:file:./db/myDbInFile;hsqldb.lock_file=false
      

      【讨论】:

        【解决方案3】:

        如果您有任何其他正在运行的客户端连接到您的数据库,您需要关闭它。

        【讨论】:

          【解决方案4】:

          无论你尝试什么方法都是正确的。

          您不必使用单独的 java 命令启动 HSQLDB 服务器,不需要下面的行,因为它会锁定数据库。防止其他进程启动和锁定数据库。

          java -cp .;C:\hsql\lib\hsqldb.jar org.hsqldb.Server -database.0 file:db\mydb -dbname.0 MYDB
          

          只运行jdbc程序

          java -cp hsqldb.jar  HSQLAccess 
          

          线下

          jdbc:hsqldb:file:db/sjdb
          

          将启动数据库并给出结果。

          这样你不必单独启动服务器,只需要运行程序,它会为你启动和停止HSQLDB。

          import java.sql.*;
          
          public class HSQLAccess {
          
              public static void main(String args[]) throws Exception
              {
                  Connection con = null;
                  try
                  {
                      Class.forName("org.hsqldb.jdbcDriver");         
                      con = DriverManager.getConnection("jdbc:hsqldb:file:db/sjdb", "sa","");    
          
                      Statement st = con.createStatement();
                      ResultSet rs = st.executeQuery("SELECT * FROM CMDS_WO_MASTER");
                      while(rs.next())
                      {
                          System.out.println(rs.getString(1));
                      }
          
                      con.close();
          
                  }
                  catch(Exception ex )
                  {
                      ex.printStackTrace();
                  }
                  finally
                  {
                      if(con!=null)
                      {
                           con.close();
                      }
                  }
              }
          }
          

          【讨论】:

            【解决方案5】:

            尝试在 windows 中使用以下连接 url 连接 = DriverManager.getConnection("jdbc:hsqldb:file:///c:/hsqldb/mydb", "SA", "");

            【讨论】:

              【解决方案6】:

              您可以通过以下方式访问已锁定的 HSQLDB 数据库:

              1- 更新my-db-name.properties 文件并添加:

              hsqldb.lock_file=false
              

              2- 或删除my-db-name.lck 文件。

              3- 或使用传递属性作为参数连接到数据库:

              #Without Sqltool:
                  java -cp [jar-path]/hsqldb-2.4.0.jar --inlineRc=url=jdbc:hsqldb:file:/[my-db-file-path]/[db-name];readonly=true;hsqldb.lock_file=false,user=sa
              
              #With Sqltool
                  java -cp [jar-path]/hsqldb-2.4.0.jar:[jar-path]/sqltool-2.4.0.jar org.hsqldb.cmdline.SqlTool --inlineRc=url=jdbc:hsqldb:file:/[my-db-file-path]/[db-name];readonly=true;hsqldb.lock_file=false,user=sa
              

              其他 HSQLDB 数据库参数可以在这里找到,但是请注意,只有少数参数可以在第一次之后更新。 http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

              【讨论】:

                【解决方案7】:

                在我的 Mac 上,HTTP 上的连接器端口从 server.xml 上的 8080 更改为 8443。这就是给我这个错误的原因:HTTP 和 HTTPS 模式都使用相同的端口

                【讨论】:

                  【解决方案8】:

                  我刚刚关闭了 NetBeans,删除了 database.lck 并再次执行了应用程序。一切正常。

                  【讨论】:

                    猜你喜欢
                    • 2014-12-16
                    • 2021-05-22
                    • 2013-09-05
                    • 2013-04-16
                    • 2016-05-12
                    • 1970-01-01
                    • 2018-08-07
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多