我正在尝试连接到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中记录insert
,delete
和select
。我在尝试java代码时没有运行DBManager。锁定问题仍然存在。
答案 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并再次执行了该应用程序。一切都很好。