Ошибка обнаружения блокировки базы данных и 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. В этой папке теперь есть .lck, tmp, script, файлы свойств с именем 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: [email protected][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: [email protected][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: [email protected][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)

Может кто-нибудь сказать мне, что я делаю неправильно? Я могу подключиться к db с помощью SwingDBManager и может insert, delete и select записи в db. Я не запускал DBManager, когда пытался использовать Java-код. Тем не менее проблема блокировки происходит.

Ответы

Ответ 1

Первая команда запускает сервер. Этот сервер блокирует файлы базы данных, чтобы "другие" не могли их модифицировать. Вы должны использовать "-dbname.0 mydb" вместо "MYDB", как это должно быть в нижнем регистре.

Ваш URL-адрес соединения Java для подключения к базе данных неверен. Вы должны использовать "jdbc: hsqldb: hsql://localhost/mydb" в качестве строки подключения. Хотя файлы базы данных блокируются сервером, вы можете получить доступ к серверу базы данных, но вы не можете получить доступ к базе данных "in-process" с файлом: URL.

Ответ 2

Если у вас есть другой клиент, который подключается к вашему db, вам нужно закрыть это.

Ответ 3

Каким бы способом вы ни старались, правильно.

Вам не нужно запускать сервер HSQLDB с помощью отдельной команды java, ниже строки не требуется, так как она блокирует базу данных. Предотвратите запуск другого процесса и блокировку 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();
            }
        }
    }
}

Ответ 4

на моем Mac, порт для Коннектора по HTTP изменился с 8080 на 8443 на server.xml. и это то, что давало мне эту ошибку: как схема HTTP, так и HTTPS использовали один и тот же порт

Ответ 5

попробуйте использовать следующий URL соединения в окнах connection = DriverManager.getConnection( "jdbc: hsqldb: файл:///c:/hsqldb/mydb", "SA", "");

Ответ 6

Я только что закрыл NetBeans, удалил database.lck и снова выполнил приложение. Все работало нормально.