最近做一个简单的桌面应用,打算用小型的HSQL做数据存储,但是想学习一下IBATIS就用了这个框架,但是折腾了我一个下午呢。
来看看问题吧:
HSQL在in-process模式下,是随应用的JVM启动的,而且必须在同一个JVM中。平时的JDBC只用使用以下代码就能连接HSQL。
的确很简单,但是我们会发现一个问题,在数据库插入后直接关闭连接,所插入的数据并没有生成相应的脚本放入.script中,而是丢失了。
查阅了一些资料,只要在url后加上 shutdown=true 就能写入。代码如下:
为什么呢?
shutdown 这个属性是让HSQL知道当HSQL的所有连接都关闭的时候,HSQL就将内存中的东东写成脚本,持久化到硬盘上。
现在我们加上IBATIS,SqlMapConfig.xml配置如下:
但是一运行程序,结果呢?
还是不行,HSQL并没有把内存中的东西写进脚本。
又得查半天资料,我发现HSQL可以直接写 XXX.script文件
而且其中的有个属性很重要,WRITE_DELAY
这是干什么的呢?
看字面的意思我们就知道是写的时候延迟。
所以我就把它改成
SET WRITE_DELAY FALSE
这样又是什么意思呢
就是说不延迟
这样再运行看看,果然可以了。
那这又是为什么呢?
我就来说说完粗浅的见解:
HSQL 是把所有DB的操作记录在内存里,然后通过这个属性配置的时间,周期的将数据同步到文件里,然而在同步以前当机了,那么所有数据都丢失了。
当然,还有一种情况,就是HSQL的服务没有shutdown就关闭了,也就是和上述类似的情况。
HSQL的shutdown在关闭服务前会将所有内存中的数据同步到文件里。
所以第一种方法才能奏效。
但至于为什么第二种方法无法奏效,还等我看过IBATIS的源代码后才能解读。
希望有高人解答下!!!