关于保存数据的hsql问题

我正在研究HSQL(嵌入应用程序)并期望数据将保存在文件系统的myDB.data文件中
相反,在干净关闭(执行sql“shutdown”,停止和关闭服务器对象)之后,剩下的唯一文件是myDB.properties,myDB.script和myDB.script具有在内存中重新创建数据的所有命令。 没有myDB.data文件
例如来自myDB.script

CREATE MEMORY TABLE PUBLIC.DUMMYTABLE(ID INTEGER PRIMARY KEY,FIRSTNAME VARCHAR(20)) 

来自myDB.properties:

 version=2.2.4 modified=no 

我以为我使用的是文件 db而不是内存db。

 Class.forName("org.hsqldb.jdbc.JDBCDriver"); HsqlProperties p = new HsqlProperties(); p.setProperty("server.database.0", "file:./testDB"); p.setProperty("server.dbname.0","myDB"); p.setProperty("server.address","localhost"); Server server = new Server(); server.setProperties(p); server.start(); Connection connection = DriverManager.getConnection"jdbc:hsqldb:hsql://localhost:9001/myDB", "SA", ""); PreparedStatement st = connection.prepareStatement("CREATE TABLE dummyTable (id INTEGER PRIMARY KEY, firstname VARCHAR(20))"); st.executeUpdate(); connection.prepareStatement("shutdown").execute(); connection.close(); server.stop(); server.shutdown(); 

如果您使用file:数据库,HSQLDB应该为您的数据库创建.script.properties (如果出现意外关闭,则可能是.log ),如果应用程序关闭,这些文件将不会被删除。 .script文件应具有重新填充数据所需的所有INSERT语句。

如果使用mem: database,则根本不会写入文件,并且不会在实例之间保存数据。 从指南 :

由于没有信息写入磁盘,因此该模式仅应用于applet或某些特殊应用程序中的应用程序数据的内部处理。 此模式由mem:protocol指定。

文件存在并在应用程序重新启动之间保留的事实本身就是您正在寻找的“文件”数据库。

编辑:

要回答你的评论,

但在这种情况下,手册中提到了* .data文件

从指南 :

此文件仅包含CACHED表的(二进制)数据记录。

有关CACHED与MEMORY表的信息,请参阅horse的答案 。 关于您何时使用CACHED表的问题,这是指南中的另一个片段 :

只有部分数据或索引保存在内存中,允许大表,否则将占用数百兆内存。 缓存表的另一个优点是,当缓存表用于大量数据时,数据库引擎启动时间较短。 缓存表的缺点是速度降低。 如果数据集相对较小,请不要使用缓存表。 在具有一些小表和一些大表的应用程序中,最好对小表使用默认的MEMORY模式。

不,那很好。

内存表是在启动时完全读入内存并在关闭时持久保存到.script文件的内存表。

如果您不想将所有数据保留在内存中,则必须创建一个CACHED表,该表主要存储在磁盘上。 只有部件被读入内存。

如果在创建表类型时未指定表类型,则默认为“MEMORY”。
http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#sqlgeneral_tabletypes-sect#N1039D

您还可以在.properties文件中设置默认表类型(内存,缓存),以便在不指定类型的情况下执行CREATE TABLE时,将创建该默认类型。

这再次在手册中解释:
http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#N14DEE

HSQL 2.2.5有一些问题。 使用HSQL DB 2.2.9版本的lib中的hsqldb.jar在最后的write语句程序中

 org.hsqldb.DatabaseManager.closeDatabases(0); 

它应该保留您在文件中的更改。