hsqldb拥有四种存 储数据的方式,之前见过的有mem和hsql,下面来介绍一下它们的用法和区别。

mem,内存(memory)存储方式。

hsqldb启动的时候会在内存中建立对应的表结构,运行期间对数据做出的所有修改都保存到内存中,最后关闭hsqldb的同时,内存中的所有数据也会全部丢失。

mem方式的缺点是每次启动hsqldb都要先创建表结构,插入初始数据,关闭hsqldb的同时数据也会全部丢失。

mem方式的优点是所有操作都在内存中进行,不会生成额外的数据文件,可以保证每次创建的数据库都是绝对干净的,这点对测试来讲很有用。

file,文件存储方式。

hsqldb使用文件保存数据库配置,表结构和更新的数据。

hsqldb运行过程中会生成四个文件,它们的文件名都是与连接url地址对应的,示例02-03/File.java中配置的url为"jdbc:hsqldb:file:db/file",对应的将是db目录下所有以file开头的文件。

file.properties存放数据库配置,包括数据库版本,缓存,表结构设置等等。

file.lck用来标记当前数据库是否已经被某一个hsqldb访问了,同一时间只有一个hsqldb能操作数据库文件,这样才能保证不会出现数据冲突。

这个文件在hsqldb启动时自动生成,正常关闭时会自动删除,但非法关闭会无法删除这个文件,如果因为这个文件出现数据库服务启动的情况,就需要手工删除。

file.script和file.log

hsqldb使用这两个文件保存数据表结构和数据,因为用到了缓存,更新的数据不会直接写入文件,而是在内存中积累一定量后,才会批量写入file.log这个日志文件。

file.script用来保存最终数据,hsqldb正常关闭的时候会把内存和日志文件(file.log)中的数据写入file.script,并删除日志(file.log)文件。

如果出现非正常关闭的情况,内存中缓存的数据会丢失,file.log也无法删除,不过不用担心,下次启动的时候hsqldb会先检测是否有未删除的file.log,将其中的数据写入file.script,再读取file.script中的数据,进行初始化操作。

File.java中的sql语句有了变化,因为使用文件保存了表结构,每次操作之前还是先删除它们比较保险。

res,资源存储方式。

它是mem与file两者的结合,我们把res.properties和 res.script放到classpath下的db/目录下,对应url= "jdbc:hsqldb:res:/db/res"。数据库启动的时候会去这两个文件里读取数据进行初始化,但不会生成res.lck和 res.log,以后进行的所有操作就都在内存里了,关闭数据库也不会写入res.script。

res就像是使用file提供初始数据的mem内存访问方式,它在系统演示的时候十分方便,设置一次初始数据就可以演示多次,而且不会影响初始数据的结果。用于测试就不太适合了,res.script明显没有sql语句便于维护,还是老老实实用sql导入更合适。

res唯一的限制是不能进行建表和删表的操作,你可以插入,修改,删除数据,但是不能修改表的结构。

hsql,socket访问方式。

使用socket链接,从一个单独运行的hsqldb服务器中获得数据,这个服务器中的hsqldb又可能是这四种存储方式。只要你想,就完全可以做成一条链状结构。