Ошибка обнаружения блокировки базы данных и 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 и снова выполнил приложение. Все работало нормально.