2011-06-15 72 views
1

我正在研究HSQL(嵌入應用程序),並期待數據將被保存在文件系統中的myDB.data文件中
乾淨關閉後執行sql(「關閉「,停止和關閉服務器對象)剩下的唯一文件是myDB.properties和myDB.script,myDB.script具有重新創建內存中數據的所有命令。沒有myDB.data文件存在
E.g.從myDB.scripthsql關於數據被保存的問題

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

myDB.script沒有包含重建數據庫所需的插入語句(包括數據)嗎? – 2011-06-15 20:57:58

+0

@Rob:看起來確實如此,但是我的理解是他們應該在* .data中。否則我不明白在哪種情況下手動提及的* .data被使用 – Cratylus 2011-06-15 21:09:24

回答

5

如果使用file:數據庫,HSQLDB應該創建.script.properties(也可能是.log如果有意外關機),爲您的數據庫,而這些如果應用程序關閉,文件將不會被刪除。 .script文件應具有重新填充數據所需的所有INSERT語句。

如果您使用的是mem:數據庫,則根本不會寫入文件,並且數據將不會保存在實例之間。從guide

由於沒有信息寫入到磁盤上,這 模式應該被只用於應用 數據的 內部處理,在小程序或某些特殊應用 。該模式由mem:協議指定爲 。

文件存在並保持在應用程序重新啓動之間的事實本身就是您正在查找的「文件」數據庫。

編輯:

爲了回答您的評論,

但在這種情況下是使用的* .data文件中手動提到

guide

此文件包含s僅用於CACHED表的(二進制)數據記錄。

有關CACHED vs MEMORY表的信息,請參見horse's answer。關於你提到的,當你想使用緩存表的問題,這裏的另一個snippet從導向:

只有他們的數據或索引的一部分保留在內存中 ,允許大表 ,否則將需要多達 數百兆內存。 高速緩存表的另一個優點是 ,當緩存表 用於大量數據時,數據庫引擎需要較少的時間啓動 。緩存表的缺點是速度下降。如果您的數據集相對較小,請勿使用緩存的 表。在一些小型表格和一些大型表格的應用程序中, 更適合在小型表格中使用默認的MEMORY 模式。

+0

ok.But在這種情況下使用手動提及的* .data文件? – Cratylus 2011-06-15 21:08:23

4

不,這很好。

內存表是在啓動時完全讀入內存並在關閉時保存到.script文件的內存表。

如果您不想將所有數據保存在內存中,則必須創建一個CACHED表,該表主要存儲在磁盤上。只有部分被讀入內存。

當您在創建時未指定表類型時,默認值爲「MEMORY」。
http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#sqlgeneral_tabletypes-sect#N1039D

您還可以設置在屬性文件默認的表型(內存,緩存),這樣,當你執行一個CREATE TABLE沒有指定類型,將創建默認類型。

此外,這本手冊中解釋說:
http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#N14DEE

+0

1)在這種情況下是* .data文件是否需要?2)CACHED推薦用於有大量數據的表格,對嗎?這樣它們不會消耗太多內存? – Cratylus 2011-06-15 21:11:35

+2

* .data文件用於CACHED表。要試用它,使用DatabaseManager連接到數據庫並執行SQL命令'SET TABLE DUMMYTABLE TYPE CACHED',然後關閉數據庫並檢查文件。 – fredt 2011-06-15 22:39:37

1

HSQL 2.2.5有一些問題。從HSQL DB 2.2.9版 的lib在你的程序在年底寫聲明

org.hsqldb.DatabaseManager.closeDatabases(0); 

使用的hsqldb.jar應該堅持在文件中所做的更改。