数据库锁获取失败和hsqldb

时间:2010-10-19 13:03:07

标签: hsqldb

我正在尝试连接到hsql数据库。我通过从C:\ myhsql:

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

这在名为mydb的目录中创建了db。此文件夹现在有一个.lck,tmp,脚本,名称为mydb的属性文件,以及当前文件夹中名为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.
...

这是stacktrace:

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连接到db,并且可以在db中记录insertdeleteselect。我在尝试java代码时没有运行DBManager。锁定问题仍然存在。

8 个答案:

答案 0 :(得分:18)

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

连接数据库的Java连接URL错误。您应该使用“jdbc:hsqldb:hsql:// localhost / mydb”作为连接字符串。虽然数据库文件被服务器锁定,但您可以访问数据库服务器,但无法使用文件“URL”在“进程内”访问数据库。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

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();
            }
        }
    }
}

答案 3 :(得分:2)

我遇到此错误是因为我想在服务器使用相同的数据库时在IntelliJ database之类的其他客户端中查看当前打开的数据库

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

hsqldb.lock_file=false

因此连接网址将类似于

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

答案 4 :(得分:1)

您可以通过以下方式访问已锁定的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

答案 5 :(得分:0)

在我的Mac上,HTTP上的Connector端口在server.xml上从8080更改为8443。这就是给我这个错误:HTTP和HTTPS架构使用相同的端口

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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