`

h2database 普及系列一: 简介

阅读更多
这不是一个新东西,但是它却是一个被严重低估的东西.
为了让它不再被继续低估,我打算为推广和宣传它贡献出自己的一点点力量.

=================================

先来个简介.
h2database 官方网站
http://www.h2database.com/

这个是一个 java编写的轻量级数据库.

类似的轻量级数据库实际上有很多, 例如java自带的derby,还有历史悠久的hsqldb,postgreSQL,sqlite...
和这些前辈比起来似乎他的来头小了一点.但是它绝对绝对绝对足够出色足够优秀.

我第一次接触他大概是在两年前, 使用它之后我就几乎再也没用过其他轻量级数据库了.(之前用过hsqldb mysql postgresql)

它完全开源, 小巧, 纯java编写,只有一个不到1M的jar(已经包含了jdbc驱动) , 不依赖任何第三方的组件.
支持多种数据库模式:  c/s模式(相当于一个轻量级的mysql), 内存模式(相当于一个轻量级的内存数据库), 嵌入式模式.
支持多种连接方式. 支持hibernate.
拥有详尽出色的文档.这是我见过的最出色的开源软件文档之一.完全可以作为一本学习数据库的教材来使用.

由于全部由java编写,所以可以用java对它进行全面的控制,例如 启动/停止服务, 管理帐号等等.
当然,如果它不与java的程序配合使用,那么优势就减少很多,因为毕竟还需要jdk支持.

=================================

和其他轻量级数据库的特性对比:




它还有如下主要特性:


更多的详细说明见:  http://www.h2database.com/html/features.html
 
下面是性能对比



(此处只是c/s模式下的对比, 这里 http://www.h2database.com/html/performance.html  还有更多的对比):


当然,它也有缺点,但是它的缺点往往只有在把它应用到它并不适合的场景(高并发 大数据量)时才会体现的比较明显.

=================================

H2DB出现也有很长时间了, 但是名气一直不大,我觉得并不是他的品质造成的,而是因为它的背后缺少大型的商业的组织支持.

近期我也正打算写一些H2DB的文章,来为h2db的普及做一些贡献,敬请期待.

JE上以前也有一些介绍性文章
大家可以自行搜索一下
在"介绍""概述"方面 显然其他作者比我更擅长


==================================
补充
==================================


针对robbin 的回复补充一个现实中的一个场景:

以前给某公司做BSS, 遇到了下面的情况.

系统的菜单 (树状结构)全部菜单项有2000多条, 菜单主要用在系统的上边导航 还有左边的菜单树
地市/分公司列表 这个不多 (毕竟联通占有率不高) 但是也有3位数了
这个应用场景极其的多, 很多操作又要用到, 相当于一个字典表
地市分公司部门列表 全部数据2000条左右,也相当于字典表

以上四种数据控制的"最小粒度"都是基于"人"的, 也就是说每个操作员操作系统时看到的都是不一样的.

这个系统同时在线人数5000多.

对于当时的运行环境来说,  web服务器是有N多台 而且很好很强大, 但是数据库并没有那么多.(对数据库做群集?太疯狂了吧).

这种类似字典表的东西通常都是取出来放到缓存里,缓存可以借助ehcache之类的组件来实现.以此来减少对数据库的操作.

但是对于上面的情况, 显然是做不到的, 因为 判断一个数据项,是否对于当前的操作员可见,要进行复杂的判断,而且要对数据项做全遍历.  而如果不缓存,每次都从数据库去取 ,这么做同样是不可取的.

所以,最好的方法就是  用运行在web服务器上的"内存数据库"来实现一个支持 sql的 高级缓存.

===================================

再拿游戏举下例子,游戏的存档就是一个小型的数据库,如果有嵌入式数据库帮忙开发游戏的话,就不用为存档系统大动干戈了,
还有, NBA LIVE系列游戏里面包含了大量的球队和球员历史信息,这些信息就是被存在一个嵌入式数据库里的.如果没有嵌入式数据库,那么游戏中检索这些球员的数据将是多么繁琐的事情啊.
同时嵌入式数据库还可以用来加密. 把软件运行时需要的资源(数据 文件 图片等)放到嵌入式数据库里, 运行时"查询出".
免得自己再写一套机密机制.

===================================

以上说了这么多, 只是想说明一下, 嵌入式内存数据库其实用处真的蛮大的. 而且用法很灵活,
套用一句俗话"它是否有用并不取决于它自身 而是取决于我们的想象力"
31
3
分享到:
评论
20 楼 Azi 2008-05-08  
强烈建议fins老大把H2的代码分析一下。想知道其原理。
19 楼 Azi 2008-05-08  
执行一个sql语句就创建数据库了。
18 楼 yuankai 2008-05-08  
请问下H2是不是不提供建数据库的命令!要想建议个数据库该怎么办?
17 楼 Azi 2008-05-08  
你可以设置压缩方式来存储了。但是现在硬盘不是问题。。。
16 楼 fins 2008-05-08  
??你在判断大小时判断的是哪几个文件啊?

我觉得你判断的方法不对
你可能把 track log 等等一些非数据库文件也计算进去了
实际上 h2一个数据库的核心文件只有两个

而生成的其他的那些都是可以删除 或者通过开关来设置掉的

他不会比 hsqldb 大的. hsqldb那个才叫过分.
15 楼 RyanPoy 2008-05-08  
曾经用过这个。且做过一些对比。相对而言,h2的速度是快。但是有一点要说的是。它的存储文件大小似乎很大。曾经测试过,数据量忘了。好像是10w条。它占用了100多M的空间,而其他的几个占用的空间很小。
14 楼 fins 2008-05-08  
主贴做了一些补充 补充了一些比较容易想到的 对嵌入式内存数据库的应用.
13 楼 kayoo 2008-05-08  
这段时间比较空 下过来玩过
web console很像eclipse
期待你的下一系列
12 楼 Azi 2008-05-08  
在同类中还不错,当然比derby和hsql好了。有个pointbase,还有borland的blacksql,也是同类。但不是免费。

所以h2还是很好的。我用它做过简单查询。
11 楼 fins 2008-05-08  
大家觉得
在和h2database同类的数据库中(嵌入式 轻量级 纯java 关系型 免费),
哪个比它更好?
我接触的还是很有限. 想听听大家的看法
10 楼 fins 2008-05-08  
用来做一个 支持 sql的 高级缓存 还是很不错的
而且并发查询问题不大
9 楼 Azi 2008-05-08  
H2的多线程还不怎么stable,缺乏生产级别的应用结果。

感觉Robbin的分析很有书生气。其实呀,要灵活。

如果是关键的业务数据,当然用Oracle,Mysql这些数据库了,备份,数据分析是不可少的。

但是如果存储的不是关键数据,用普通的数据库。比如JE,存储量不受限制。可以存些互联网抓取下来的网页,图片等等。这些东西丢了也不重要的。利用JE的高并发和索引。以便快速查找图片。这比存储在硬盘上多份效果。

H2当然还没有达到企业业务级别。不能存放用户,密码等关键数据。所以适合做demo。做测试。还有桌面应用。

用什么数据库还是看什么业务需求,看你是读的多还是写得多。这方面mysql就很好抓住web的80%是读,20%是写。把查询做的非常好。

而Oracle则抓住电信,银行等业务系统的关键,因为这些系统的每个一次操作都跟金钱发生关系,出错要钱的,所以事务处理要特别的准确,不容出错。

所以觉得Facebook用mysql一点不奇怪。但是爬虫爬回回来的东西用mysql存储,也肯定不好,几十亿的网页肯定崩溃。所以用嵌入式的BerkeryDB来存储非常适合。
8 楼 fins 2008-05-08  
http://www.h2database.com/html/frame.html?grammar.html%23setmultithreaded&main

似乎h2支持 在嵌入式/内存模式时使用多线程

只是实现的可能还有些问题 所以作者没有把多线程模式默认设置成true(1)
7 楼 seekgirl 2008-05-07  
这个东西在国外因该比较火吧,appfuse都有支持
6 楼 robbin 2008-05-07  
以C/S模式运行对于嵌入式数据库来说没有什么优势,性能并不特别突出,没有丰富的管理工具和开发工具,功能也比较简陋。

嵌入式数据库最吸引人的地方还是进程内部运行,主要在两个方面的用途:

1、轻便的单元测试
2、刻到光盘上面的分发程序、或者应用软件内置的小型数据库引擎

但这两个用途对于企业应用来说,没多大吸引力。

实际上高性能嵌入式数据库在企业应用这一块有非常大的空间。很多企业应用都有这样一个非常迫切的需要:要把整个字典表、应用配置表或者访问异常频繁的小表加载到内存当中进行频繁的查询,以提高对频繁使用的小表的查询性能。但是为了编程的方便,以及支持传统应用的需要,要能够支持以SQL的方式查询,而不是面向对象数据库的Map遍历。更何况把字典表在内存当中以对象缓存的方式构造出来本身也是很烦琐的事情。

所以最完美的解决方案就是:能够把大型数据库的字典表加载到应用服务器内存当中的嵌入式数据库来,使得字典表的查询可以以纯Java进程内部操作来实现,但是程序员可以用SQL来查询,毕竟SQL是目前最强大的数据查询的DSL。如果能有满足这种需求的数据库存在,db4o啥的可以卷铺盖了。

这里唯一的障碍就是嵌入式数据库必须支持并发查询,而且要能够支持很高的并发才行。遗憾的是H2目前还不支持。

5 楼 atianchen 2008-05-07  
DB4O也很不错,jar包也不大
4 楼 Azi 2008-05-07  
我有用过。一直想弄明白H2数据库原理。可没有时间去弄。还是fins高手,去弄。我支持看。

ORM是不同领域的东西。

学了数据库才知道什么时候建索引,什么是主键外键,各个关系是怎么样。ORM也不能解决所有问题。人家JE就是靠写的强大的B树来占地位的。尽管没有sql功能。

3 楼 fins 2008-05-07  
哈哈 看来楼上很熟悉H2啊
希望你也能写一些相关的文章 我们一切为推动H2努力 呵呵

其实这类嵌入式数据库在企业级应用中并不普遍 所以似乎很少有人在意他
另外 现在都是ORM了 人们对关系型数据库的关注度已经降到了冰点了.

不过 在这个有限的领域内 ,我相信H2会成为领先者的.

之前 ROBBIN说过, H2和 HSQL都是"单线程的" 这个我没明白
因为当使用 c/s模式建立服务时 是多线程的啊

而作为嵌入式使用时 又不会出现高并发 所以我认为这么应该不算是缺点吧

BTW: 我喜欢H2 还有一个原因就是看derby和hsql不爽.
derby难用 不够小巧 速度慢 就因为背后有apache , 本身并不出色.
hsql不思进取的典范. 数据库文件的存储方式实在不敢恭维

2 楼 Azi 2008-05-07  
建议分析下代码给大家看看吧
1 楼 Azi 2008-05-07  
哈哈,我也研究过H2Database的代码,还有JE的代码。

java的数据库H2Database和JE是最好的了。

H2Database只是不能支持大数据,曾经用来一个项目,超过2G就不行了。但是,它的代码很精简,值得学习。

JE更是用来用来存储。在企业级中适合用存储简单的东西。


其实呢,这个项目只是一个人在写。每半月更新一次。文档并不详细。但由于代码没那么多。所以还是学数据库的好教材。

其实那么多功能中。嵌入式数据库才是最有用的。其他c/s结构都超级简单。

作者是HSQLDB早期开发者,后来去了pointbase。然后出来创建了这个项目。存储过程还不支持,触发器有支持,看了代码就知道触发器很简单的。

但是该数据库是MVCC的结构,可以不用lock,来提升性能。

备份和恢复都超级简单。就是生产压缩文件。关键是学习数据库的结构。

品质来说,不算很好,也不算很差。

相关推荐

    H2 Database(H2内存数据库)

    4、H2Database_SQL语法.doc 5、H2Database高级特性.doc 6、H2Database聚合函数.doc 7、H2Database连接配置.doc 8、H2Database数据类型.doc 9、H2Database中文教程.doc 10、H2内存数据库h2部署操作手册.docx 11、H2...

    H2 DataBase学习

    3 jdbc数据库URL:jdbc:h2: test test为h2 database默认提供的测试数据库 4 所有新数据库都会被自动创建 二 h2 database 的控制台">一 简介 h2 database 是一个开源免费的Java SQL数据库 数据库分为嵌入式 ...

    H2Database.rar_H2Database聚合函数_H2数据库函数||_h2数据库修改

    H2Database是一款轻量级、高性能的开源关系型数据库,广泛应用于嵌入式系统和测试环境。它提供了丰富的SQL支持,包括聚合函数,使得在处理大量数据时能够进行高效的统计和分析。本文档将深入探讨H2Database的聚合...

    使用JAVA内存数据库h2database性能优化

    h2database是一款轻量级、高性能的Java内存数据库,特别适合用于处理实时性强、对响应速度要求高的业务逻辑。 2.1 h2database的启动 h2database有两种启动模式:嵌入式和控制台模式。嵌入式模式中,数据库与应用...

    H2Database内存数据库

    2. **连接数据库**:通过JDBC驱动连接H2Database,使用`jdbc:h2:mem:`或`jdbc:h2:`前缀指定内存或文件模式数据库。 3. **创建表和插入数据**:使用SQL语句创建表结构,如`CREATE TABLE ...`,并使用`INSERT INTO .....

    H2Database.rar_H2Database中文教程_h2database_h2database视频

    《H2Database中文教程》是针对数据库管理系统H2Database的一款详尽指南,旨在帮助学习者理解和掌握这款轻量级、高性能的Java嵌入式数据库。H2Database以其易用性、灵活性和广泛的特性集,成为了开发者进行测试和小型...

    H2Database中文教程

    jdbc:h2:file:/path/to/mydb;DB_CLOSE_DELAY=-1 ``` `DB_CLOSE_DELAY=-1`表示即使所有连接关闭,数据库也不会立即关闭,而是等待新连接。 ### Spring Hibernate配置 在Spring和Hibernate框架中配置H2数据库,需要在...

    H2Database-SQL.rar_H2Database-SQL语法_h2database 语法_h2database详解

    H2Database是一款开源、轻量级、内存模式的数据库管理系统,它支持多种SQL标准,包括SQL:2003、SQL:2008和部分SQL:2011。这款数据库广泛应用于测试、开发以及嵌入式系统,因为它的易用性、高性能和灵活性。在"**H2...

    H2DataBase+iBatis简易demo

    【H2DataBase+iBatis简易demo】是一个演示项目,展示了如何将轻量级的H2数据库与流行的Java持久层框架iBatis进行集成。在这个项目中,开发人员使用了MyEclipse作为IDE,并且H2数据库被配置为两种运行模式:内存模式...

    h2database,h2是一个用java编写的可嵌入rdbms。.zip

    H2数据库是一个由Java编写的高性能、轻量级的关系型数据库管理系统(RDBMS),它在许多场景下作为开发和测试的理想选择。由于其开源性质,H2数据库得到了全球开发者社区的支持,允许自由使用、修改和分发。下面将...

    H2Database中文教程.pdf

    此外,H2还提供了一系列命令行工具,方便用户进行各种数据库操作,如数据导入导出、SQL执行等。这些工具可以与OpenOffice进行集成,为用户提供更加丰富的数据处理功能。 在Web应用开发中,H2还支持JNLP(Java ...

    H2Database.rar_H2Database高级特性

    H2Database是一款轻量级、开源的嵌入式和服务器模式的Java数据库,适用于测试、开发和嵌入式系统中的数据存储。它以其高性能、易用性和灵活性而受到开发者的欢迎。本文将深入探讨H2Database的高级特性,帮助你更好地...

    H2 database db zip 安装包

    H2数据库是一个开源、轻量级、嵌入式的Java数据库,适用于各种应用场景,从本地单用户模式到大型多用户服务器模式。它支持多种数据库引擎,包括内存、文件、和分布式模式,可以方便地在开发环境中使用,同时也适合...

    H2 Database Engine

    H2 Database Engine是一款轻量级、高效的开源数据库系统,专为快速开发和临时用途而设计。它的主要特点是其小巧的体积和出色的性能,这使得它成为开发者在进行项目原型设计或者测试环境搭建时的理想选择。H2 ...

    H2 database

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

    内存数据库h2database(h2-2008-11-07)

    内存数据库H2 Database是Java开发的一个轻量级、高性能、开源的关系型数据库系统。它可以在内存中运行,也可以存储在磁盘上,并且支持多种模式,包括单用户模式、服务器模式以及分布式集群模式。H2 Database的设计...

    H2 database source code and document

    H2 database 是一个非常著名的数据库,其性能相当优秀,支持嵌入,client-server模式,支持内存表,cached,text表, 本压缩包 包含 H2 database 源代码和文档 本版本 为最新版本 2010-12-12

    h2 database使用

    配置方面,H2提供了丰富的命令行选项,可以通过`jdbc:h2:` URL来创建或连接数据库。例如,创建一个名为"test"的内存数据库: ```sql jdbc:h2:mem:test ``` **数据类型** H2数据库支持标准的SQL数据类型,如INT、...

    h2database

    H2数据库是一款轻量级、高性能的开源内存数据库系统,主要设计用于嵌入式环境,也可作为独立服务器使用。它的名字“H2”意指“第二个版本的氢”,象征其简洁且快速的特性。H2数据库支持SQL标准,并提供多种数据库...

    H2database

    H2数据库是一款轻量级、高性能的开源关系型数据库,尤其适合于开发人员在本地进行快速测试和原型设计。它的名字“H2”源于“Half a dozen, version 2”,暗示了其小巧且不断进化的特性。这款数据库系统支持多种模式...

Global site tag (gtag.js) - Google Analytics