【发布时间】:2018-01-10 06:12:39
【问题描述】:
我是 HSQLDB 的新手,刚刚遇到这个错误,我无法在互联网上找到任何解决方案,好像我错过了一些东西 ^^
我的应用程序目前除了创建两个表(如果它们不存在)之外没有做任何其他事情。
这是我处理 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 版的 HSQLDB,但也尝试过使用一些旧版本
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
提前感谢您的任何建议。
【问题讨论】:
-
您可能使用的是旧版本的 HSQLDB。试试最新的。
-
@fredt 我正在使用 2.4.0 的 HSQLDB,它应该是最新的,也编辑了我的问题。无论如何感谢您的帮助:)
-
在其他语句之后添加 connection.prepareStatement("CHECKPOINT").execute() 应该可以解决问题;
-
@fredt 谢谢,这解决了我的部分问题,但随后发生了一个稍微不同的异常。我对“CHECKPOINT”查询进行了更多研究,因为我从未听说过它,并发现当我的应用程序关闭时我应该在最后调用“SHUTDOWN”查询。这样就解决了所有异常。非常感谢您的帮助
-
@Leoko Hii,我正在做 JUnit 测试并得到相同的唯一性错误。可以请协助代码吗?以及需要粘贴该代码的位置。