我正在研究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
我以为我使用的是文件数据库而不是内存数据库。
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();
答案 0 :(得分:6)
如果使用file:
数据库,HSQLDB应该为您的数据库创建.script
和.properties
(如果出现意外关闭,可能还有.log
,这些如果关闭应用程序,则不会删除文件。 .script
文件应包含重新填充数据所需的所有INSERT语句。
如果使用mem:
数据库,则根本不会写入文件,并且不会在实例之间保存数据。来自guide:
由于没有信息写入磁盘, 此模式应仅用于 内部处理申请 数据,applet或某些特殊的 应用。指定了此模式 通过mem:protocol。
文件存在并在应用程序重新启动之间保留的事实本身就是您正在寻找的“文件”数据库。
编辑:
回答你的评论,
但是在哪种情况下使用的手册中提到的* .data文件
来自guide:
此文件仅包含CACHED表的(二进制)数据记录。
有关CACHED与MEMORY表的信息,请参阅horse's answer。关于您何时使用CACHED表的问题,这里是指南中的另一个snippet:
只有部分数据或索引是 在内存中,允许大表 否则就会占用 几百兆的内存。 缓存表的另一个优点是 数据库引擎占用较少 在缓存表时启动的时间 用于大量数据。该 缓存表的缺点是 降低速度。不要使用缓存 表格,如果您的数据集是相对的 小。在一些应用程序中 它和一些大的桌子 最好使用默认的MEMORY 小桌子的模式。
答案 1 :(得分:4)
不,那很好。
内存表是在启动时完全读入内存并在关闭时持久保存到.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
答案 2 :(得分:1)
HSQL 2.2.5存在一些问题。 使用HSQL DB版本2.2.9的lib中的hsqldb.jar 在你的程序结尾写声明
org.hsqldb.DatabaseManager.closeDatabases(0);
它应该保留您在文件中的更改。