2017-08-02 219 views
2

我是新來的HSQLDB,只是得到這個錯誤,我不能在互聯網上找到任何解決這個,好像我失去了一些東西^^HSQLDB - 完整性約束違例:唯一約束或索引違例; BLOCKS_PK表:阻止

我的應用程序是目前除了創建兩個表,如果它們不存在的話,不要做其他任何事情。

這是我的代碼,處理HSQLDB:

try { 
    Class.forName("org.hsqldb.jdbc.JDBCDriver"); 
} catch (Exception e) { 
    System.err.println("ERROR: failed to load HSQLDB JDBC driver."); 
    e.printStackTrace(); 
    return; 
} 

try { 
    connection = DriverManager.getConnection("jdbc:hsqldb:file:"+mi.getDataFolder().getPath()+"\\data\\storage;hsqldb.lock_file=false", "SA", ""); 
    connection.prepareStatement(
      "CREATE TABLE IF NOT EXISTS Punishments (" + 
      "id INTEGER IDENTITY PRIMARY KEY," + 
      "name VARCHAR(16)," + 
      "uuid VARCHAR(35)," + 
      "reason VARCHAR(100)," + 
      "operator VARCHAR(16)," + 
      "punishmentType VARCHAR(16)," + 
      "start BIGINT," + 
      "end BIGINT," + 
      "calculation VARCHAR(50))" 
    ).execute(); 
    connection.prepareStatement(
      "CREATE TABLE IF NOT EXISTS PunishmentHistory (" + 
      "id INTEGER IDENTITY PRIMARY KEY," + 
      "name VARCHAR(16)," + 
      "uuid VARCHAR(35)," + 
      "reason VARCHAR(100)," + 
      "operator VARCHAR(16)," + 
      "punishmentType VARCHAR(16)," + 
      "start BIGINT," + 
      "end BIGINT," + 
      "calculation VARCHAR(50))" 
    ).execute(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 

,我運行代碼的前兩週左右的時間,它工作正常,但在某些時候,我不斷收到此錯誤:

[22:22:21 FATAL]: statement error processing log - open continuedplugins\AdvancedBan\data\storage.log line: 2 
    org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; BLOCKS_PK table: BLOCKS 
      at org.hsqldb.error.Error.error(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.Constraint.getException(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.Session.addInsertAction(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.Table.insertNoCheckFromLog(Unknown Source) ~[AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.ScriptRunner.runScript(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.ScriptRunner.runScript(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.Log.processLog(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.Log.open(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.persist.Logger.open(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.Database.reopen(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.Database.open(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.DatabaseManager.getDatabase(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.DatabaseManager.newSession(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
      at java.sql.DriverManager.getConnection(Unknown Source) [?:1.8.0_111] 
      at java.sql.DriverManager.getConnection(Unknown Source) [?:1.8.0_111] 
      at me.leoko.advancedban.manager.DatabaseManager.setup(DatabaseManager.java:69) [AdvancedBan-2.0.6-SNAPSHOT.jar:?] 
[...] 

這是如何.log文件看起來後,我得到了錯誤的例子:

/*C1*/SET SCHEMA SYSTEM_LOBS 
INSERT INTO BLOCKS VALUES(0,2147483647,0) 
COMMIT 
/*C2*/SET SCHEMA PUBLIC 
CREATE TABLE IF NOT EXISTS Punishments (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
CREATE TABLE IF NOT EXISTS PunishmentHistory (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
DISCONNECT 
/*C4*/SET SCHEMA PUBLIC 
CREATE TABLE IF NOT EXISTS Punishments (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
CREATE TABLE IF NOT EXISTS PunishmentHistory (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
DISCONNECT 
/*C3*/SET SCHEMA PUBLIC 
CREATE TABLE IF NOT EXISTS Punishments (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
CREATE TABLE IF NOT EXISTS PunishmentHistory (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
DISCONNECT 
/*C3*/SET SCHEMA PUBLIC 
CREATE TABLE IF NOT EXISTS Punishments (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 
CREATE TABLE IF NOT EXISTS PunishmentHistory (id INTEGER IDENTITY PRIMARY KEY,name VARCHAR(16),uuid VARCHAR(35),reason VARCHAR(100),operator VARCHAR(16),punishmentType VARCHAR(16),start BIGINT,end BIGINT,calculation VARCHAR(50)) 

我使用的是版本2.4.0Ø f HSQLDB,但也試過這個與一些舊版本

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <version>2.4.0</version> 
    <scope>compile</scope> 
</dependency> 

謝謝你的任何建議提前。

+0

您可能正在使用舊版本的HSQLDB。嘗試最新的。 – fredt

+0

@fredt我正在使用2.4.0的HSQLDB應該是最新的,也編輯了我的問題。無論如何,試圖幫助:) – Leoko

+0

在其他語句後添加connection.prepareStatement(「CHECKPOINT」)。execute()並且它應該修復問題; – fredt

回答

0

當我的應用程序正在關閉時,我不得不最終調用「SHUTDOWN」SQL命令,並且時不時地發出「CHECKPOINT」SQL命令。

謝謝你幫我解決這個問題。