web-dev-qa-db-ja.com

データベースロックの取得の失敗とhsqldb

私はhsql dbに接続しようとしていました。 C:\ myhsqlから実行して作成しました。

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

これにより、mydbというディレクトリにdbが作成されました。このフォルダーの現在のフォルダーには、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を使用してdbに接続し、db内のinsertdelete、およびselectレコードを使用できます。 Javaコードを試しましたが、DBManagerを実行していませんでした。それでもロックの問題が発生します。

21
markjason72

最初のコマンドはサーバーを起動します。このサーバーはデータベースファイルをロックするので、「他の人」はそれらを変更できません。小文字であるため、「MYDB」の代わりに「-dbname.0 mydb」を使用する必要があります。

データベースに接続するためのJava接続URLが間違っています。接続文字列として「jdbc:hsqldb:hsql:// localhost/mydb」を使用する必要があります。データベースファイルがサーバーの場合、データベースサーバーにはアクセスできますが、file:URLを使用してデータベースを「処理中」にアクセスすることはできません。

20
fredt

サーバーが同じdbを使用しているときに、現在開いているデータベースをIntelliJ databaseなどの別のクライアントで表示したかったため、このエラーが発生します。

hsql dbを複数のクライアントに接続できるようにするには、

hsqldb.lock_file=false

接続URLは次のようになります

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

Dbに接続する他のクライアントを実行している場合は、それを閉じる必要があります。

5
Jokasy

あなたが試みたどの方法も正しいです。

Separate 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();
            }
        }
    }
}
2
muthu vel

windowsで次の接続URLを使用してみてくださいconnection = DriverManager.getConnection( "jdbc:hsqldb:file:/// c:/ hsqldb/mydb"、 "SA"、 "");

0
japkpc

NetBeansを閉じ、database.lckを削除して、アプリケーションを再度実行しました。すべてがうまくいきました。

0
Tundro

次の方法で、ロックされている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

0
Safa Far

私のMacでは、HTTPのコネクタのポートがserver.xmlの8080から8443に変更されました。そしてそれが私にこのエラーを与えていました:HTTPとHTTPSスキーマの両方が同じポートを使用していました

0
iammyr