分享吧嵌入式数据库 H2 Database vs SQLite

Posted 大连飞创

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分享吧嵌入式数据库 H2 Database vs SQLite相关的知识,希望对你有一定的参考价值。

一、前言

     提起数据库,每一个软件开发人员都不会陌生。数据库是存储数据的仓库,是长期存储在计算机内、有组织的、可共享的数据集合。在网络的世界中,数据一直是传输和被操作的主要对象,尤其是在大数据时代的今天。随着数据数量的激增和数据间复杂度的提高,以及应用场景的千变万化,对于数据库技术也提出了更高的要求。因此,各种数据库如雨后春笋般的出现在软件技术的世界里。

二、嵌入式数据库

     大家所熟悉的传统数据库,无论是磁盘数据库还是内存数据库,出于数据安全、管理便利、运维等等角度考虑,都将应用与数据分离,分别独立部署,如下图所示,如大家所熟知的Oracle、mysql、Redis等。磁盘数据库,其特性倾向于稳定、安全;内存数据库,其特性倾向于高并发、快速响应。

【分享吧】嵌入式数据库 H2 Database vs SQLite

     更进一步,随着各行各业的迅猛发展,业务服务的垂直深入,特定的应用场需要更加针对性的技术支持。轻量级的Web应用、智能手机App等如雨后春笋般迅速占领着市场。这些应用场景对于数据的存储也不再是大数据、高可用,而是单纯的数据管理、数据存储、快速响应、运维简便等基本的需求,于是一种嵌入到应用内部的数据库应运而生。如下图所示,由于其运行依赖于应用进程,生命周期也不再独立,而是跟随应用的启停。

【分享吧】嵌入式数据库 H2 Database vs SQLite

三、常用嵌入式数据库

1

H2 Database

     H2是一个开源的、纯Java实现的关系型数据库。支持网络版和嵌入版本,另外还支持二者的混合应用。H2具有较好的兼容性,支持相当标准的sql标准。H2使用时非常简单,只有一个jar文件,可以直接嵌入到应用项目中。

2

SQLite

     SQLite是一个小型的C程序库,实现了独立地、可嵌入的、零配置的SQL数据引擎。SQLite也支持大部分的sql标准。

3

对比分析

【分享吧】嵌入式数据库 H2 Database vs SQLite

     为了充分了解两款数据库,利用Java应用对两款数据库进行了深入的调研,从以上各个方面着手进行了对比。并且为了更好的实施应用,着重从以下几点进行了进一步的分析。

3.1

运行模式

     相较与SQLite,H2支持三种不同的运行模式,以适用于更多不同的应用场景。

     1)嵌入式模式:

     嵌入式模式下,应用与H2运行于同一个JVM中,H2被应用启动。该模式也是性能最好的模式,也是官方推荐的模式。

【分享吧】嵌入式数据库 H2 Database vs SQLite

     2)服务器模式

     服务器模式下,H2被H2 Server启动(独立于应用的JVM),应用与数据分离,应用使用远程连接(如JDBC)访问数据库。类似于传统数据库的部署,服务器可以与应用部署与同一台机器,也可以部署与另一台机器。实际上,H2 Server本身也是使用嵌入式模式来启动运行H2 Database的。显然,由于服务器模式是通过远程连接访问数据,其性能也要低于嵌入式模式。

【分享吧】嵌入式数据库 H2 Database vs SQLite

     3)混合模式

     该模式是嵌入式模式与混合模式的融合。一个应用启动嵌入式模式的H2 Database,其他应用可以将其作为服务器模式来远程访问。

【分享吧】嵌入式数据库 H2 Database vs SQLite

3.2

SQL支持

     H2和SQLite支持大多数的SQL92标准的功能,但也有部分功能不支持。相对H2,SQLite对SQL92的支持更少,在使用时也存在更大的局限性:

     1)不支持RIGHT OUTER JOIN、FULL OUTER JOIN,只实现了LEFT OUTER JOIN。

     2)ALTER TABLE,支持RENAME TABLE和ALTER TABLE的ADD COLUMN VARIANTS命令,不支持DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。

     3)TRIGGER,支持FOR EACH ROW触发器,但不支持FOR EACH STATEMENT触发器

     4)VIEWS,视图是只读的,不可以在视图上执行DELETE\INSERT\UPDATE语句。

     5)GRANT和REVOKE,可以应用的唯一访问权限是底层操作系统的正常文件访问权限。

     另外,H2更提供了数据库兼容模式可供选择,可以进一步支持不同数据库的SQL特性,结合嵌入式数据库的特点,可以广泛应用于单元测试。如使用Junit等实施单元测试时,可以用H2来代替独立的Oracle数据库,进而实现应用的独立运行,更方便实现持续集成。

3.3

事务

     H2和SQLite都支持事务的commit和rollback控制。而在此之上,H2更提供了对MVCC的支持。

   MVCC,Multi-Version Concurrency Control,即多版本并发控制。简单来说,这种机制解决的是多连接并发访问数据库时,同时读写带来的数据“半读”“半写”的脏数据问题。在并发的同时读写同一条数据时,相对于对数据加排他锁并等待,MVCC有更好的性能表现。每个连接到数据库的读操作,在某个瞬间看到的是数据库的一个快照,其他连接的写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他连接的读操作来说是不可见的。因此,提供MVCC操作的H2,在并发读写的性能方面,比SQLite更加优秀。

3.4

性能

     性能已然成为数据库应用的重要指标。以下针对两款数据库的各种不同操作,对比分析二者的性能表现。

     测试使用的机器为:

    CPU——Intel E5-2440 2.40GHz(2 处理器)

     内存——8.00GB

     操作系统——Windows7 64bit

     虽然是公司内网虚拟机,单一定程度上可以对比二者的性能差异,具体数据与参考操作如下,时间单位为ms,每个操作均取10次的平均值。

     1)单连接(非并发):

【分享吧】嵌入式数据库 H2 Database vs SQLite

     2)多连接(并发):

【分享吧】嵌入式数据库 H2 Database vs SQLite

     可见,在单连接无并发的场景下:

●   从无条件查询(SELECT)操作的角度来看,SQLite的性能远高于H2;

●   从写操作角度来看,少量数据的场景SQLite性能高于H2,但随着数据量的增加,二者的表现又趋于一致,参考INSERT操作的100w条数据场景。

●   在复杂查询上的表现方面(JOIN、主键查询、非主键查询),SQLite的性能要高于

然而在多连接并发的场景下:

●   10w数据的情况下二者性能基本一致

●   H2的耗时随数据量呈线性增长,而SQLite在一定数据量级上(100w)的表现并不理想。

     综上所述,在无并发的情况下,SQLite的整体性能要高于H2,而在并发的场景下,H2 的性能表现要远比SQLite稳定。

四、总结

     H2 Database,设计初衷是面向Java应用,虽然其性能在非并发场景下的表现不如SQLite显著,但是其多运行模式、对并发场景的良好支持,使其更适合于轻量级的Web应用或服务。

     SQLite,对多种开发语言有着良好的支持,其非并发场景下的显著性能,更适合于手机App的内部数据存储与管理。

     相较传统数据库,嵌入式数据库是依附于应用进程内的。既提供了传统关系型数据库的SQL操作的便利性,又提供了进程内访问控制的高效性。同时“嵌入式”这一显著特征,使其融合与应用内部,无形中在提高了程序设计的良好结构化的基础上,又使应用整体的运维更加简化。这些优点,使越来越多的应用青睐于嵌入式数据库。

未来我们将持续跟踪嵌入式数据库的发展,期待其带来更多的惊喜。


以上是关于分享吧嵌入式数据库 H2 Database vs SQLite的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Embedded Database 的 JPA 未找到记录

Confluence 6 嵌入的 H2 数据库

Confluence 6 嵌入的 H2 数据库

如何使用 JDBC 更新/更改 H2 数据库中的用户帐户名?

如何修复:嵌入式 H2 数据库“NonTransientError:无法读取所在位置的页面”错误?

使用 Hibernate 的存储过程在嵌入式 h2 数据库中失败