`

沉浮于各种文件型数据库 hsqldb h2 还是derby

阅读更多

原始发表时间:2009-09-10

 

    经过几天的折腾终于还是心碎了,前前后后为了这个数据库共计花费了约2周的时间……
    系统采用的是经典技术框架 Spring 2.0.5 + Hibernate 3.2 + iBatis 2.2.0
    用于连接文件型数据库的jdbc连接工具是ExecuteQuery 3.1.5(以下简称为EQ)
    数据库目前采用的是 hsqldb
    测试环境下准备了一个大小为33Mb的数据库命名为 test.script ,核心的是存放主要数据的资料表,主要结构如下:

create table Member_info(
    id char(32), employee_id char(32), employee_name varchar(50), company_id char(32), company_name varchar(50), ... ,
    user_def_txt0 varchar(50), user_def_txt1 varchar(50), ... , user_def_txt9 varchar(50),
    user_def_num0 number(8,2), user_def_num1 number(8,2), ... , user_def_num99 number(8,2)
)

    好了,一切准备就绪,开始说明一下为什么hsqldb和h2这么折腾我了吧!!

1.在这个应用里,hsqldb的内存模式和cached模式都不能用
    使用hsqldb的内存模式来读入数据,会发现连接数据库的时候奇慢无比,读了一下hsqldb的源代码,发现它在创建数据库连接的时候,会检查log文件、script文件的修改时间是否一致,而后查询网上hsqldb的开发者Thomas的话是说,也会检查properties文件中modified属性是否为yes,如果在退出应用的时候,没有执行shutdown,那么modified值肯定为yes,这样的话,下次连接数据库的时候,hsqldb会认为上次的退出是非法退出,需要根据log文件的内容从中断处进行恢复,并将这些未写入的数据继续写入到script数据文件中。
    具体执行过程时,先创建一个与script文件同名的后缀为.new的文件,比如数据文件为test.script,那么临时文件的名称为test.script.new,等数据写入完成后,删除原有的script文件,重命名.new的文件为test.script。
    目测这个转换的时间就很长……所以这里就不再给出具体的时间长度……

    使用 EQ 连接内存模式下的hsqldb,会发现连接速度也是挺慢……猜测是内存模式下,会将33Mb的数据全部都载入到内存,这个加载过程或许也在耽误着我们宝贵的时间……

    cached模式,使用EQ和应用连接数据库都是奇怪无比,而后进行应用中最常用的一个业务功能测试性能,这个业务功能根据几十个公式对库表中的某些数值字段进行计算,例如以下这些语句:

update member_info
set user_def_num0 = user_def_num1 + user_def_num2 + user_def_num3
where company_id = '123456'

update member_info
set user_def_num10 = user_def_num11 * 1.3 + user_def_num12
where company_id = '123456'

……

    测试的时候,涉及到的数据行数大约在800行左右,company_id 上有单独的索引,执行的速度上,内存模式非常的快,cached模式大约慢30%左右,还算可以接受……
    不过仔细观察cached模式下,hsqldb产生的后缀为.data的文件,会发现一个很可怕的事情——
    内存模式下,script大小为33Mb,转换为cached模式后,存放数据的文件是.data文件,大约为68Mb。使用上述的十多个sql语句执行计算之后,会发现.data文件大小变成了200Mb。
    观察应用程序占用的内存空间(还有虚拟内存空间),发现内存模式和cached模式不相上下……这和hsqldb中宣称的cached模式很省资源的说法大相径庭……

    因为纠结于这么大的data文件会不会有什么其他性能问题,所以想在计算完成后,执行“checkpoint defrag”来对数据库进行压缩,结果却让人无法接受——执行步骤基本与之前的重新连接内存模式的数据库一样,会先创建.new的文件,再删除原有data文件,而后重命名——这个过程耗时实在是太久了,大约需要1分钟多,基本上是无法接受的时间长度。

2.H2的性能堪忧
    还是挺感谢Thomas的热情回复,之前在google新闻组上发帖求助,许多朋友帮助,最热情的莫过于H2作者的Thomas,他同时也是hsqldb的作者。
    怀着对hsqldb的无比敬意,试用了H2,但是在上面的计算过程中遇到了无法逾越的性能问题,根据我的测试结果来看,上述计算过程在hsqldb中每条update语句耗时0.2秒,在H2中则需要大约2秒;于是我发帖求助是否存在设置问题,后来Thomas也做了测试,比我测试的结果性能要好一些,但是仍然有5倍以上的耗时差距,因此该应用也无法使用H2,因为我们不能让用户在计算过程上等待得太久!!

3.Derby
    现在时间是2009年9月11日0:29:52,刚刚将数据移植到Derby,在压缩稳定后,数据文件夹大小约为66Mb。
    使用 EQ 的连接速度也还不错,使用上述的update语句,单条执行的时间约为 0.2 秒跟hsqldb相仿……这一步步似乎激动人心哦……但是没有通过应用的实地考察,暂时无法下定论。


    通关本文没有给出一个确切的结论,甚至没有具体的测试结果数据,因为这些太依赖于环境,基本没有参考价值。这里只是想通过本文传达一个观点,任何新技术都得经过多种不同的角度来考察后,得出一个在一定环境中是否适用的结论。

分享到:
评论
3 楼 kris_zhang 2017-06-28  
Derby 使用的怎么样?
2 楼 tag13346 2012-05-18  
H2必建索引,否则就是个悲剧
1 楼 hilly 2011-03-19  
hsqldb查询数据表50W行后,查询单行数据时间超长,达到1分钟以上,查询条件对应列上未建索引。

相关推荐

    H2DB使用文档

    1.常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2, HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独 立的客户端和服务器端。2.H2的优势: 1、h2采用纯Java编写,因此...

    嵌入式数据库引擎 H2.zip

    几个嵌入式数据库的对比: H2 Derby HSQLDB MySQL PostgreSQL Pure JavaYesYesYesNoNoMemory ModeYesNoYesNoNoTransaction IsolationYesYesNoYesYesCost Based OptimizerYesYesNoYesYesEncrypted ...

    HSQLDB数据库

    HSQLDB数据库,经典啊

    hsqldb数据库软件

    hsqldb是我们进行Java开发的最常用的数据库之一,希望大家能够喜欢

    Oracle数据库移植到HsqlDB操作手册.docx

    Oracle数据库移植到HsqlDB操作手册

    HSQLDB快速连接数据库

    HSQLDB中文文档,能够提高数据的处理速度。

    嵌入式数据库hsql

    This package contains the latest release 1 of HSQLDB 1.7.3 HSQLDB is a relational database engine and a set of tools written in Java. The file index....

    Java编写的关系数据库:hsqldb_1.7.3

    HSQLDB 是一个用Java编写的关系数据库管理系统。 其作为一个小型数据库,很是小巧。 它提供了一个快速轻量级)数据库引擎,该数据库引擎提供基于磁盘和内存的表。

    hsqldb-2.2.8数据库

    Hsqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速。

    开源数据库软件hsqldb

    博文链接:https://newdebug.iteye.com/blog/80868

    H2嵌入式数据库

    H2的优势: 1、h2采用纯Java编写,因此不受平台的限制。 ...H2比HSQLDB的最大的优势就是h2提供了一个十分方便的web控制台用于操作和管理数据库内容,这点比起HSQLDB的swing和awt控制台实在好用多了

    hsqldb-2.5.0.zip

    开源数据库hsqldb最新版本2.5.0,含源代码及bin文件 Open-sourced database hsqldb2.5.0, including source code and bin file(stuctured in form of .BAT)

    hsqldb小型数据库

    hsqldb小型数据库,适合快速开发,非常给力

    hsqldb-2.3.2.zip

    HyperSQL也是一个不错的嵌入式数据库 ">hsqldb 2 3 2 zip HyperSQL是用Java编写的一款SQL关系数据库引擎 它的核心完全是多线程的 支持双向锁和MVCC 多版本并发控制 几乎完整支持ANSI 92 SQL 支持常见数据类型 最新...

    嵌入式数据库H2开始服务

    NULL 博文链接:https://fuzhaohui.iteye.com/blog/1481585

    hsqldb数据库系统

    HSQLDB 是一个轻量级的纯Java开发的开放源代码的关系数据库系统。因为HSQLDB的轻量(占用空间小),使用简单,支持内存运行方式等特点,HSQLDB被广泛用于开发环境和某些中小型系统中。 HSQLDB的运行需要Java环境的...

    用JAVA写的hsqldb面向对象的数据库

    用JAVA写的hsqldb面向对象的数据库 非常轻量级 适合自己进行JAVA程序的开发,里面含有源代码。 极力推荐!!!!

Global site tag (gtag.js) - Google Analytics