2010-10-19 29 views
14

我試圖連接到hsql數據庫。我創建了一個通過在C運行:\ myhsql:數據庫鎖定採集失敗和hsqldb

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

這在名爲db目錄中創建mydb。此文件夾現在具有名稱爲mydb的.lck,tmp,腳本,屬性文件以及當前文件夾中名稱爲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) 

有人可以告訴我做錯了什麼?我可以使用SwingDBManager連接到db,並且可以在db中使用insertdeleteselect記錄。當我嘗試java代碼時,我沒有運行DBManager。仍然會發生鎖定問題。

回答

14

第一個命令啓動服務器。該服務器鎖定數據庫文件,以便「其他人」無法修改它們。您應該使用「-dbname.0 mydb」而不是「MYDB」,因爲它應該是小寫字母。

連接到數據庫的Java連接URL是錯誤的。您應該使用「jdbc:hsqldb:hsql:// localhost/mydb」作爲連接字符串。雖然數據庫文件被服務器鎖定,但您可以訪問數據庫服務器,但無法使用file:URL訪問數據庫「in-process」。

+0

thanx fredt的幫助.. – markjason72 2010-10-19 17:01:11

4

如果你有任何其他客戶端運行連接到你的數據庫,你需要關閉它。

1

無論你嘗試過的方式是正確的。

您不必使用seperate 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(); 
      } 
     } 
    } 
} 
0

在我的Mac上,HTTP上Connector的端口從server80上的8080更改爲8443。那是什麼給了我這個錯誤:HTTP和HTTPS模式都使用相同的端口

0

嘗試在窗口中使用以下連接url connection = DriverManager。getConnection(「jdbc:hsqldb:file:/// c:/ hsqldb/mydb」,「SA」,「」);

0

我剛剛關閉了NetBeans,刪除了database.lck並再次執行了應用程序。一切正常。