HSQLDB - 无法重新启动加密数据库

HSQLDB - cannot restart encrypted database

我在 Tomcat 中有一个 Java Web 应用程序 运行,它嵌入了一个 HSQLDB 服务器数据库。我正在尝试加密此数据库。

我第一次启动 Tomcat 数据库创建的很好,文件看起来是加密的,应用程序按预期运行。但是,当我关闭 Tomcat 并重新启动时,出现以下错误:

5990 [main] DEBUG uk.co.my.db.HyperSqlDbServer  - Starting HSQL server...
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@e79eb3]: [Thread[main,5,main]]: setDatabasePath(0,file:C:\path\to\my\db\dbname;crypt_key=6f841e23d0976a695e7bc7d122c1927d;crypt_type=AES)
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@e79eb3]: [Thread[main,5,main]]: setDatabaseName(0,dbname)
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@e79eb3]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@e79eb3]: Initiating startup sequence...
[Server@e79eb3]: Server socket opened successfully in 0 ms.
[Server@e79eb3]: [Thread[HSQLDB Server @e79eb3,5,main]]: Database [index=0, db=file:C:\path\to\my\db\dbname, alias=dbname] did not open: org.hsqldb.HsqlException: java.io.IOException: Not in GZIP format
[Server@e79eb3]: Startup sequence completed in 344 ms.
[Server@e79eb3]: 2015-11-03 10:51:32.137 HSQLDB server 2.2.4 is online on port 9001
[Server@e79eb3]: To close normally, connect and execute SHUTDOWN SQL
[Server@e79eb3]: From command line, use [Ctrl]+[C] to abort abruptly

我的启动和关闭代码的相关部分如下:

/*
 * (non-Javadoc)
 * @see org.springframework.context.Lifecycle#start()
 */
public void start() {
    if (server == null) {
        logger.debug("Starting HSQL server...");                        
        server = new Server();
        // NB: explicitly setting path and name as it didn't work having them in properties file
        server.setDatabasePath(0, properties.getProperty("server.database.0"));
        server.setDatabaseName(0, properties.getProperty("server.dbname.0"));
        try {               
            server.setProperties(properties);               
            server.start();
            running = true;
        } catch(Exception e) {
            logger.error("Error starting HSQL server", e);
            throw new ConfigurationException(e);
        }
    }

}

/*
 * (non-Javadoc)
 * @see org.springframework.context.Lifecycle#stop()
 */
public void stop() {
    logger.debug("Stopping HSQL server...");
    ShutdownDAO shutdown = context.getBean(ShutdownDAO.class);
    if (server != null) {
        shutdown.shutdownDatabase();
        server.shutdown();
        server.stop();
        running = false;
    }
}

ShutdownDAO.shutdownDatabase() 方法执行以下操作:

public void shutdownDatabase(){     
    jdbcTemplate.execute("SHUTDOWN COMPACT");
}

start()方法中引用的属性设置如下:

    // NB: these first two properties only seem to work as part of the path and don't get picked up when in the properties file
    internalDbProps.put("crypt_key", this.internalCryptKey);
    internalDbProps.put("crypt_type", "AES");

    internalDbProps.put("server.database.0", "file:C:\path\to\my\db\dbname;crypt_key=" + this.internalCryptKey + ";crypt_type=AES");
    internalDbProps.put("server.dbname.0","dbname");
    internalDbProps.put("server.remote_open","true");
    internalDbProps.put("hsqldb.reconfig_logging","false");
    internalDbProps.put("shutdown","true");

如果我不尝试加密数据库,一切正常。

关键部分是异常 没有打开:org.hsqldb.HsqlException:java.io.IOException:不是 GZIP 格式 - 这向我暗示数据库有没有被正确关闭。我在关闭数据库时尝试了 SHUTDOWN 和 SHUTDOWN COMPACT 以查看这是否是导致问题的原因,但无济于事。

关机时相关日志摘录如下:

21515 [HSQLDB Connection @fbfa2] INFO  hsqldb.db.HSQLDB50CD101BCF.ENGINE  - Database closed
21906 [HSQLDB Connection @fbfa2] INFO  hsqldb.db.HSQLDB50CD101BCF.ENGINE  - Database closed
[Server@63f6ea]: Initiating shutdown sequence...
[Server@63f6ea]: Shutdown sequence completed in 0 ms.
[Server@63f6ea]: 2015-11-03 11:16:49.726 SHUTDOWN : System.exit() was not called

包含数据库的文件夹在关机后只包含dbname.properties和dbname.script文件。 .properties 文件包含以下内容:

#HSQL Database Engine 2.2.4
#Tue Nov 03 11:16:49 GMT 2015
version=2.2.4
modified=no

.script 文件似乎已加密。

但是当Tomcat重新启动时,出现了上述错误。

请注意,由于客户端的限制,我只能使用 Java 5 - 所以我使用的是 hsqldb-j5 2.2.4。如果这个问题在未来的版本中得到修复,我可能无法升级。

编辑 - Java 5 条信息

正如下面的 fredt 所指出的,Java 5 版本可以从 Maven 获得,在 pom.xml

中有以下内容
  <dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.3.3</version>
    <classifier>jdk5</classifier>
  </dependency>

不幸的是,错误仍然存​​在于 J5 - 但这可能对将来的其他人有用。

编辑 - 附加信息

与数据库的连接使用 C3P0 汇集在一起​​ - 这可能会对数据库的关闭方式产生影响吗?

该问题是由于加密密钥在服务器重新启动之间被其他地方的代码损坏造成的。因此,数据库被错误地解密并导致遇到 GZIP 格式错误。