论坛首页 综合技术论坛

谈一下纯java数据库hsqldb的standalone(in-process)模式

浏览 12684 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-09  
在hsqldb的官方文档中,介绍standalone的篇幅很少,总共100多页的文档,这种模式只有不到一页。本来这种模式用到的机会比较小,但碰巧这两天看spring mvc(spring官方的那个step-by-step的例子),这个例子中的hsqldb正是运行在standalone模式下。

这种模式的特点有2个。
第一个特点,顾名思义,standalone。也就是这个数据库是可以不依赖其它任何东西,独立存在,包括数据库引擎。和in-memory模式相比,这种模式的数据是可以持久化的,存在形式就是几个文件。和server方式比,要使用这种模式下的数据库不需要启动任何的server或者监听。
第二个特点,同样可以顾名思义,in-process。这种模式下,数据库引擎和应用程序跑在一个jvm中。对大部分应用,这种模式可以加快速度,因为数据不再需要在网络中传输。但是这种方法也有个缺点,就是process之外的程序,比如database manager,无法看到数据库中的数据。

hsqldb官方推荐:开发的时候用server模式,部署到实际生产环境的时候才用standalone模式。

下面是springmvc step by step中的例子:

数据库配置信息:
db.driver=org.hsqldb.jdbcDriver
db.url=jdbc:hsqldb:db/test
db.user=sa
db.pw=

上面第二行就隐含了hsqldb要运行在standalone模式下。也可以写成如下的方式:
db.url= jdbc:hsqldb:file:c:/eclipse/springmvc/db/test 



ant 任务:

    <target name="loadData">
        <echo message="LOAD DATA USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue">  
            <classpath refid="master-classpath"/>

        INSERT INTO products (id, description, price) values(1, 'Lamp', 5.78);
        INSERT INTO products (id, description, price) values(2, 'Table', 75.29);
        INSERT INTO products (id, description, price) values(3, 'Chair', 22.81);
        COMMIT;
        SHUTDOWN

        </sql> 
    </target>


    <target name="clearData">
        <echo message="CLEAR DATA USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue">  
            <classpath refid="master-classpath"/>

        DELETE FROM products;

        </sql> 
    </target>		

在每次单元测试之前,先执行clearData和loadData这两个任务。这样可以重新构造正确的测试数据。(maybe用in-memory模式更理想)

另外,有一点需要特别注意的。

缺省时,数据也是保存在memory中的,如果想要持久化数据,需要在关闭vm之前执行hsqldb的命令 SHUTDOWN。


   发表时间:2007-01-21  
以前没有接触过hsqldb,学习
0 请登录后投票
   发表时间:2007-01-26  
从网上下了equinox的代码,运行之后找不到数据库文件
jdbc:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:db/equinox
jdbc.username=sa
jdbc.password=
从哪里找到equinox的数据库文件?
0 请登录后投票
   发表时间:2007-01-26  
letle 写道
从网上下了equinox的代码,运行之后找不到数据库文件
jdbc:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:db/equinox
jdbc.username=sa
jdbc.password=
从哪里找到equinox的数据库文件?


equinox没有用过。
从jdbc.url可以看出,equinox里面用到的数据库也是运行在standalone模式之下的。
并且暗示,运行equinox的目录下有一个db的子目录,其中应该已经建立一个equinox的standalone的数据库。

因为提示是没有找到数据库文件。有2种可能:
1. 压根没有建立这个数据库。可以通过搜索文件equinox.* 来确认,如果没有找到。那就说明确实没有建立。找到equinox的数据库脚本,建立之。
2. 建立了数据库,但是路径不对。其实standalone的数据库的url可以指定绝对路径的。如:
jdbc.url=jdbc:hsqldb:file:${your_equinox_install_dir}/db/equinox


按照绝对路径,设置好jdbc.url。这个错误应该可以解决。
0 请登录后投票
   发表时间:2007-01-27  
pupi 写道
letle 写道
从网上下了equinox的代码,运行之后找不到数据库文件
jdbc:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:db/equinox
jdbc.username=sa
jdbc.password=
从哪里找到equinox的数据库文件?


equinox没有用过。
从jdbc.url可以看出,equinox里面用到的数据库也是运行在standalone模式之下的。
并且暗示,运行equinox的目录下有一个db的子目录,其中应该已经建立一个equinox的standalone的数据库。

因为提示是没有找到数据库文件。有2种可能:
1. 压根没有建立这个数据库。可以通过搜索文件equinox.* 来确认,如果没有找到。那就说明确实没有建立。找到equinox的数据库脚本,建立之。
2. 建立了数据库,但是路径不对。其实standalone的数据库的url可以指定绝对路径的。如:
jdbc.url=jdbc:hsqldb:file:${your_equinox_install_dir}/db/equinox


按照绝对路径,设置好jdbc.url。这个错误应该可以解决。
不是应用提示没有找到数据库文件,而是运行的正常,而且数据都写入了,但是在equinox的目录下我找不到数据库文件,没有db的目录,也没有*.script的文件,好困惑。
   非常感谢。
0 请登录后投票
   发表时间:2007-01-27  

引用
缺省时,数据也是保存在memory中的,如果想要持久化数据,需要在关闭vm之前执行hsqldb的命令 SHUTDOWN。


这个可能是问题的原因。
0 请登录后投票
   发表时间:2007-01-27  
pupi 写道

引用
缺省时,数据也是保存在memory中的,如果想要持久化数据,需要在关闭vm之前执行hsqldb的命令 SHUTDOWN。


这个可能是问题的原因。
但是应用启动的时候怎么装入数据呢?
0 请登录后投票
   发表时间:2007-01-27  
letle 写道
pupi 写道

引用
缺省时,数据也是保存在memory中的,如果想要持久化数据,需要在关闭vm之前执行hsqldb的命令 SHUTDOWN。


这个可能是问题的原因。
但是应用启动的时候怎么装入数据呢?



可以看看下面的帖子
http://www.iteye.com/topic/48848

spring mvc step by step这个例子,没有装入数据的过程,而是先用ant 任务将数据库,表,初始数据建好了。

其实letle也可以用这个方法的。
0 请登录后投票
   发表时间:2007-01-28  
谢谢大家,不过我还是搞不明白数据在哪里保存的,如果肯定不是在内存,因为tomcat关闭的时候数据被写入了。但是找不到数据库文件。有兴趣的朋友可以运行一下。下载
0 请登录后投票
   发表时间:2007-01-29  
补充一下(在springside看到的,在hsqldb的官方文档中没有查到):

另外有一种读取jar/classpath中的script文件的In-Process方式,方便发布war时不知道具体路径的情况。不过这种方式是只读不存盘的,利用来单元测试也不错。下面的设置将读取classpath根目录下的db/test.script

jdbc:hsqldb:res:/db/test
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics