`

沉浮于各种文件型数据库 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编写,因此...

    hsqldb-2.2.8数据库

    HSQldb(HyperSQL Database)是一款高效、轻量级且开源的Java数据库管理系统,它在IT领域中被广泛应用于开发、测试以及小型应用环境。HSQldb完全用Java编写,因此具有良好的跨平台性,可以在任何支持Java的系统上...

    HSQLDB快速连接数据库

    - **类型和算术操作**:介绍了HSQLDB支持的各种数据类型,包括整型、浮点型、二进制类型等,并解释了不同类型之间的转换规则和算术运算。 - **序列和标识**:说明了如何在HSQLDB中实现自动递增字段和序列生成器,这...

    HSQLDB数据库

    HSQLDB(HyperSQL Database)是一个开源的关系型数据库管理系统,因其轻量级、高性能和易用性而受到广大开发者的欢迎。这个数据库引擎支持多种运行模式,包括单用户模式、内存模式、文件模式以及服务器模式,适用于...

    开源数据库软件hsqldb

    HSQldb,全称HyperSQL Database,是一款完全开源、免费的Java实现的关系型数据库管理系统(RDBMS),它支持多种运行环境,包括独立服务器模式、嵌入式模式以及Web应用。HSQldb因其轻量级、高性能和易于集成的特点,...

    嵌入式数据库引擎 H2.zip

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

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

    - **启动与操作**:Oracle是企业级的关系型数据库管理系统,通常通过企业管理器或SQL*Plus进行管理,而HsqlDB是一个轻量级的内存数据库,可直接通过命令行或批处理脚本启动。 - **数据类型定义**:Oracle和HsqlDB...

    嵌入式数据库H2开始服务

    嵌入式数据库H2是Java开发的一款轻量级、高性能的关系型数据库,广泛应用于桌面应用程序和服务器环境。它以其小巧的体积、快速的性能和易于使用的特点,在IT领域内受到许多开发者的青睐。H2数据库支持多种模式,包括...

    hsqldb数据库软件

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

    H2 数据库 1.1.104

    H2数据库是一款轻量级、高性能的关系型数据库管理系统,由HSQLDB的作者设计和开发。作为开源软件,H2数据库在许多方面展现了其优越性,尤其在速度和易用性上,它甚至能比HSQLDB运行得更快。这款数据库引擎支持多种...

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

    HSQDB支持SQL标准,包括SQL:2016,这使得它与大多数其他关系型数据库在语法上具有良好的兼容性。 **主要特点** 1. **轻量级**: HSQDB设计简洁,占用资源少,适合于内存中或硬盘上的数据库应用。对于开发环境和小型...

    嵌入式开源数据库系统对比

    - **灵活的数据模型**:可以支持关系型数据库、面向对象数据库等多种数据模型。 - **事务支持**:提供事务管理机制,保证数据的一致性和完整性。 - **应用场景**:适合于需要高性能、大数据量存储的应用场景,尤其...

    Java嵌入式数据库H2学习大全

    H2还兼容多种数据库系统,包括IBM DB2、Apache Derby、HSQLDB、MS SQL Server、MySQL、Oracle和PostgreSQL等,这使得迁移至H2时更容易上手。 #### 安全属性 H2在安全方面做了大量工作,包括但不限于: - 提供针对...

    hsqldb小型数据库

    HSQDDL(HyperSQL Database)是一款轻量级、高性能的开源关系型数据库管理系统,通常简称为HSQDB。它被广泛应用于快速开发和测试环境中,因其小巧的体积、高效的速度以及对Java平台的良好支持而受到青睐。 HSQDB的...

    hsqldb使用(转载)

    HSQldb是一个轻量级的关系型数据库管理系统,特别适合用于系统演示、开发和测试环境。它的特点是快速、灵活且易于使用。HSQldb支持多种运行模式,满足不同场景的需求。 1. **数据库实例创建** 创建HSQldb数据库...

    hsqldb相关几个文件

    标题 "hsqldb相关几个文件" 提到的是与HSQldb相关的压缩包资源,HSQldb是一个开源的关系型数据库管理系统,特别适用于Java应用程序。描述中提及的有两个zip文件:hsqldb_1_8_0_10.zip 和 hsqldb-mini.zip,以及一个...

    hsqldb 数据库 免安装

    hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议。 相对其他数据库来说,其体积小,才563kb。...仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容

Global site tag (gtag.js) - Google Analytics