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

2023-11-03

原始发表时间: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相仿……这一步步似乎激动人心哦……但是没有通过应用的实地考察,暂时无法下定论。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • org.apache.derby.jdbc.ClientDriver 在哪里?

    我下载了jar包核心 Apache Derby 数据库引擎 还包括嵌入式 JDBC 驱动程序 10 9 1 0 http mvnrepository com artifact org apache derby derby 但那个罐子不包括
  • 如何在文件系统中存储图像

    目前 我已将图像 最大 6MB 作为 BLOB 存储在 InnoDB 表中 随着数据大小的增长 夜间备份变得越来越慢 阻碍了正常性能 因此 二进制数据需要进入文件系统 指向文件的指针将保存在数据库中 数据具有树状关系 main site u
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 可以重复应用并产生相同结果的数据库操作吗?

    我现在一片空白 或者像有些人说的那样 正在经历一个高级时刻 我知道这个概念有一个正式的定义和名称 其中在数据库中运行的数据库操作 存储过程 如果重复运行将产生相同的结果 它属于数学家的自反 对称 传递等类型 您的意思是 确定性 吗 如果使用
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 将数据库与 Clojure 结合使用

    有哪些使用 Clojure 数据库的方法 我从 Clojure 知道你可以用 Java 做任何事情 但这意味着我最终可能会使用一些过于复杂的东西 比如 Hibernate 这与 Clojure 的简单性相冲突 有什么建议或意见吗 Cloju
  • 巩固 Django 南迁移

    在我的项目的初始阶段 我对模型进行了很多更改 因此我最终为我的应用程序生成了很多向南迁移 在转到我的生产服务器执行迁移之前 是否可以以任何方式整合它们 这样我就不会为每个应用程序进行一百万次迁移 如果是这样 我该怎么做呢 您始终可以删除现有
  • 如何使用 Wix 运行 sql 脚本创建数据库

    我在使用 Wix 创建数据库时遇到问题 我能找到的示例 参见下面的链接 都是首先使用 wix 创建数据库并运行创建表 sql 脚本 问题是我需要将 wix 设置为使用 CREATE DATABASE 运行 sql 脚本来创建数据库和表 而不
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 触发器与非规范化存储过程的优缺点

    当涉及到对事务数据库中的数据进行非规范化以提高性能时 至少 有三种不同的方法 通过存储过程推送更新 更新规范化交易数据和非规范化报告 分析数据 在事务表上实现更新辅助表的触发器 这几乎总是维护历史时所采取的路线 将处理推迟到夜间批处理 可能
  • 主键默认可以为NULL吗?为什么这样描述呢?

    我有一张桌子 当我describe这是 mysql gt DESC my table Field Type Null Key Default Extra contact id int 11 NO PRI NULL auto incremen
  • 数据库中的 HTML 标签是不好的做法还是好的做法?

    有时我需要格式化来自数据库的特定数据或部分数据 例如 如果我有这样的 desc 存储在数据库中 HTML 4 经过调整 延伸和增强 超出了其最初的范围 为网站带来了高水平的交互性和多媒体 Flash Silverlight 和 Java 等
  • 如何按关系的数量或成员对 Doctrine DQL 查询进行排序?

    我正在尝试创建一个查询 用于从 Doctrine 数据库中检索对象 并按特定一对多关系的成员数量排序 更具体地说 我有两个实体 Person 和 Federation 一个人可以是一个联盟的成员 人具有 联盟 关系 并且一个联盟可以有n人
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • 使用显式创建表语句与 select into 创建表

    使用显式创建表语句和加载数据与选择数据之间是否存在性能差异 此示例仅显示 2 列 但问题是针对使用非常大的表 下面的示例也使用临时表 尽管我也想知道使用常规表的效果 我认为无论表格类型如何 它们都是相同的 临时表场景 Explicitly

随机推荐

  • 梯度有关问题

    1 偏导数 方向导数 导数是函数随自变量的变化率 对于 一元函数 只有一个自变量x 那么函数y f x 的导数是 在某一点处沿x轴正方向的变化率 多元函数 多个自变量 是多维向量 那么函数随自变量的变化怎么刻画呢 一个方法 就是衡量函数在给
  • 【终极区分】iterable和iterator

    1 凡是可作用于for循环的对象都是Iterable类型 2 凡是可作用于next 函数的对象都是Iterator类型 它们表示一个惰性计算的序列 3 集合数据类型如list dict str等是Iterable但不是Iterator 不过
  • C#中的拆箱与装箱

    1 什么是拆箱和装箱 在C 中 值类型是直接将数据存储在栈空间中 而引用类型是将数据存储在堆空间中 同时在栈空间中存储一个对该数据的引用 那么如果将一个值类型转换为一个它实现的某个接口或object会发生什么 结果必然是对一个存储位置的引用
  • Nodejs源码解析之module

    http blog csdn net leoleocs article details 50245677 module管理是Nodejs中比较有特色的部分 官方有详细的文档https nodejs org api modules html
  • el-tabs通过动态组件来更新单个tab页

    使用element ui的el tabs时 加载页面时会将所有单个tab页渲染出来 如果两个有联系的单个tab页 其中一个添加了数据 另一个tab页只有刷新才会显示出新的数据 使用动态组件来更新单个tab页 在data中定义tab列表 da
  • UnboundLocalError: cannot access local variable XXX where it is not associated with a value解决办法

    代码如图 a 1 def test a 1 test 此时运行代码会产生以下报错 UnboundLocalError cannot access local variable a where it is not associated wit
  • 查找两个字符串的相同代码块--Java

    前提 两个字符串中只有一个最大相同子串 public String getMaxSameString String str1 String str2 if str1 null str2 null String maxStr str1 len
  • 视图的定义与操作

    数据库系统 实验报告 实验名称 视图的定义与操作 实验地点 实验楼423 实验日期 一 实验目的及要求 1 掌握创建视图的SQL语句的用法 2 掌握修改视图的方法 3 熟悉视图更新与基本表更新的区别与联系 4 认识视图的作用 二 实验环境
  • vue获取+设置光标位置 光标定位 选择输入框文本

    版本 vue2 vant2 在vue是用ref r e f s 获取 d o m 的 在
  • STM32移植LVGL踩坑集锦

    这篇文章我主要讲解一下我在移植LVGL时所遇到的一些坑以及解决方法 LVGL的移植过程可以参考我前面的文章 http t csdn cn QSVOO 第一个 问题 在lvgl8 1以前的版本可能会出现MY DISP HOR RES 和 MY
  • QtDesigner中如何手动添加工具栏toolBar

    如下图 只需要把Action拖到工具栏中即可
  • Android scroller控件,Android Scroller完全解析

    在Android中 任何一个控件都是可以滚动的 因为在View类当中有scrollTo 和scrollBy 这两个方法 如下图所示 这两个方法的主要作用是将View ViewGroup移至指定的坐标中 并且将偏移量保存起来 另外 mScro
  • ES的基本介绍和使用

    增 删 改 查 全部遵循refult 风格 使用postman来新建一个文档 1 增加 http localhost 9200 blog1 article 1 id 1 title 在弹性搜索中创建索引时 content 为什么呢 因为ma
  • nginx 之 root 和 alias

    目录 1 alias 语法 2 root 语法 3 差别 1 alias 语法 Syntax alias path Default Context location 定义指定location的替换 例如 使用以下配置 location i
  • 计算机网络:流量控制和拥塞控制

    拥塞控制和流量控制 流量控制 如果发送方把数据发送得过快 接收方可能会来不及接收 这就会造成数据的丢失 TCP的流量控制是利用滑动窗口机制实现的 接收方在返回的数据中会包含自己的接收窗口的大小 以控制发送方的数据发送 拥塞控制 拥塞控制就是
  • win10 装MySQL Instance Configuration Wizerd 卡死/未响应问题

    一 若此前安装过MySQL应当先将此前的文件残留清除干净 见链接http blog csdn net aerchi article details 50432934 二 隐藏文件ProgramData MySQL也应当删除 偷懒方法就是在安
  • Linux命令·chmod

    chmod命令用于改变linux系统文件或目录的访问权限 用它控制文件或目录的访问权限 该命令有两种用法 一种是包含字母和操作符表达式的文字设定法 另一种是包含数字的数字设定法 Linux系统中的每个文件和目录都有访问许可权限 用它来确定谁
  • Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 8.x提示报错

    1 在使用统一脚手架的时候提示了报错信息如下 ERROR in app containers App SiderMenu SiderPanel style scss node modules css loader node modules
  • java实现进程控制块_操作系统:进程管理和IO控制

    一 进程管理 进程管理包括进程控制 进程调度 进程同步与通信 死锁控制四个内容 一 进程控制 进程是操作系统中运行的基本单位 包括程序段 数据段和进程控制段 操作系统通过进程控制块 PCB 管理进程 每一个PCB唯一标示一个进程 它存储进程
  • 沉浮于各种文件型数据库 hsqldb h2 还是derby

    原始发表时间 2009 09 10 经过几天的折腾终于还是心碎了 前前后后为了这个数据库共计花费了约2周的时间 系统采用的是经典技术框架 Spring 2 0 5 Hibernate 3 2 iBatis 2 2 0 用于连接文件型数据库的