Ошибка получения блокировки базы данных и hsqldb - PullRequest
21 голосов
/ 19 октября 2010

Я пытался подключиться к базе данных 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, 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: 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 и могу insert, delete и select записи в БД.Я не работал DBManager, когда я попробовал Java-код.Все еще проблема блокировки происходит.

Ответы [ 7 ]

18 голосов
/ 19 октября 2010

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

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

5 голосов
/ 08 января 2012

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

3 голосов
/ 13 августа 2018

Я сталкиваюсь с этой ошибкой, потому что я хотел просмотреть текущую открытую базу данных в другом клиенте, например IntelliJ database, пока сервер использует ту же самую базу данных

, чтобы hsql db мог подключаться к нескольким клиентам, используйте

hsqldb.lock_file=false

поэтому URL соединения будет выглядеть как

jdbc:hsqldb:file:./db/myDbInFile;hsqldb.lock_file=false
2 голосов
/ 28 августа 2012

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

Вам не нужно запускать сервер HSQLDB с помощью отдельной команды java, нижняя строка не требуется, поскольку она заблокирует базу данных. Запретить запуск и блокировку других процессов.

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();
            }
        }
    }
}
0 голосов
/ 10 мая 2017

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

0 голосов
/ 30 сентября 2015

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

0 голосов
/ 17 августа 2015

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

...