H2 与SQLite

背景H2介绍特点纯Java编写,不受平台的限制;只有一个jar文件,适合作为嵌入式数据库使用;h2提供了一个十分方便的web控制台用于操作和管理数据库内容;功能

这篇文章给大家聊聊关于H2 与SQLite,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

特征

纯Java编写,不受平台限制;它只有一个jar文件,适合用作嵌入式数据库; h2提供了一个非常方便的Web控制台来操作和管理数据库内容;它功能齐全,支持标准SQL 和JDBC。麻雀虽小,但该有的功能都有;它支持嵌入式模式、服务器模式和集群。支持全文检索,使用Apache Luncene提供内置全文检索和全文索引,支持磁盘和内存数据库,支持只读数据库,支持临时表,支持事务(读提交和序列化事务隔离),支持2阶段提交,支持多连接,支持使用基于成本的优化机制的表级锁,并使用零遗传算法来管理复杂的查询。支持滑动可更新结果集、支持大结果集、支持结果集排序、支持方法返回结果集、支持数据库加密(使用AES或XTEA进行加密)、支持SHA-256密码加密、提供加密功能、支持SSL场景

H2最大的用处就是可以与应用程序一起打包发布,这样就可以非常方便地存储少量的结构化数据。它的另一个用途是单元测试。启动速度快,并且可以关闭持久化功能。每个用例执行完毕后,都会恢复到初始状态。 H2的第三个用途是作为缓存,作为NoSQL的补充。当某些场景数据模型必须是关系型时,可以将其作为Memcached作为后端MySQL/Oracle的缓冲层,用来缓存一些不经常变化但需要频繁访问的数据,例如字典表、权限表等。但系统架构会更加复杂。另外,由于H2文件体积非常小,安装和启动都非常简单,并且支持全文搜索等高级功能,因此在一些简单的场景中也可以使用H2来快速构建应用程序。

建筑学

数据类型

整数(INT)

布尔类型(BOOLEAN)

微整数(TINYINT)

小智

大整数(BIGINT)

身份

货币编号(十进制)

双精度实数(DOUBLE)

真实的

时间(时间)

日期(日期)

时间戳(TIMESTAMP)

二进制

其他类型(OTHER)

变量字符串(VARCHAR)

不区分大小写的变量字符串(VARCHAR_IGNORECASE)

字符

二进制大对象(BLOB)

文本大对象(CLOB)

通用唯一标识符(UUID)

数组(数组)

操作模式

嵌入式模式:在嵌入式模式下,应用程序和数据库位于同一个JVM 中,并通过JDBC 连接。可以持久化,但同一时间只能有一个客户端连接。嵌入模式性能会更好。如果使用H2数据库的内存模式,我们创建的数据库和表只存储在内存中。一旦服务器重新启动,内存中的数据库和表将不再存在。服务器模式:使用服务器模式与嵌入模式相同,只不过它可以运行在另一个进程中。混合模式:第一个应用程序以嵌入模式启动,后续应用程序以服务器模式运行。混合模式是嵌入式模式和服务器模式的结合。第一个应用程序通过嵌入模式建立与数据库的连接,并且也作为服务器启动,以便其他应用程序(运行在不同进程或虚拟机中)可以同时访问相同的数据。第一个应用程序的本地连接的执行速度与嵌入模式连接一样快,而其他连接理论上会稍微慢一些。

连接方式

使用嵌入式(本地)连接方式连接H2数据库:该连接方式默认只允许一个客户端连接H2数据库。一个客户端连接H2数据库后,此时数据库文件会被锁定,其他客户端无法再连接(jdbc:h2:[file:][path]databaseName)。使用TCP/IP服务器方式(远程连接)连接H2数据库:这种连接方式与其他数据库类似。它是基于服务形式连接的,因此允许多个客户端同时连接H2数据库(jdbc:h2:tcp://server[:port]/[path]databaseName)。

文件锁

当数据库打开时,会创建一个锁文件来告诉其他进程该数据库已被占用。如果数据库关闭或数据库进程终止,锁定文件将被自动删除。

以下是锁定文件的几种方法:

默认的方法是通过看门狗线程检查文件锁来保护数据库文件。看门狗线程每秒读取锁定的文件并检查数据库文件是否可用。第二种方法是服务器端口方法,打开服务器端口。服务器端口方法不需要每秒读取锁定文件。服务器端口只能用于只能位于一台计算机(始终是同一台计算机)上的数据库文件。参观时使用。也可以在不使用文件锁的情况下打开数据库,在这种情况下,需要应用程序来保护数据库文件。

SQLite

简介

SQLite 是一个轻量级数据库且符合ACID 的关系数据库管理系统,包含在一个相对较小的C 库中。它是由D. Richard Hipp 建立的公共领域项目。其设计目标是嵌入式,目前已经应用于很多嵌入式产品中。它占用的资源非常低。在嵌入式设备中,只需几百K 的内存就足够了。它可以支持Windows/Linux/Unix等主流操作系统,并且可以与多种编程语言结合,如Tcl、C#、PHP、Java等,以及ODBC接口。 SQLite的第一个Alpha版本诞生于2000年5月,到2021年已经快21岁了,SQLite也迎来了版本。 SQLite 3 已经发布。

特征

支持零配置的ACID 事务 无需安装和管理配置完整的数据库存储在单个磁盘文件中数据库文件可以在不同字节顺序的机器之间自由共享支持高达2TB 的数据库大小足够小,大约130,000 行C 代码,4.43M在大多数普通数据库上比一些流行的数据库更快更容易操作。 Easy API包含TCL绑定,并支持通过Wrapper进行其他语言的绑定。源代码注释良好,测试覆盖率超过90%。独立版:没有额外的依赖,完全开源。您可以将其用于任何目的,包括出售。支持多种开发语言,C、C++、PHP、Perl、Java、C#、Python、Ruby等架构。

数据类型

SQLite 是一个动态类型系统。在SQLite 中,值的数据类型与值本身相关,而不是与其容器相关。 SQLite 的动态类型系统与其他数据库的更通用的静态类型系统兼容,但同时,SQLite 中的动态类型允许它执行传统刚性类型数据库无法完成的操作。为了最大限度地提高SQLite 和其他数据库之间的兼容性,SQLite 支持列上的“类型关联”概念。列的类型亲和性是指存储在该列上的推荐数据类型。这里要记住的一件事是,这种类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是某些列,如果有选择的话,会更喜欢某些存储类型而不是其他类型。该列首选的存储类型称为“近似值”。

如果类型字符串包含’INT’,则该字段的相关类型为INTEGER。如果类型字符串包含“CHAR”、“CLOB”或“TEXT”,则该字段的相关类型为TEXT,例如VARCHAR。如果类型字符串包含“BLOB”,则该字段的关联类型为NONE。如果类型字符串包含“REAL”、“FLOA”或“DOUB”,则该字段的相关类型为REAL。在所有其他情况下,字段的关联类型为NUMERIC。数据类型

关系种类

应用规则

INT

整数

天音

小智

中薄荷

BIGINT

无符号大整型

INT2

INT8

整数

1

人物(20)

VARCHAR(255)

变化的性格(255)

NCHAR(55)

原生角色(70)

NVARCHAR(100)

H2 与SQLite

文本

CLOB

文本

2

BLOB

没有指定数据类型

没有任何

3

真实的

双倍的

双精度

漂浮

真实的

4

数字

小数(10,5)

布尔值

日期

日期时间

数字

5

SQLite 没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)

SQLite 没有单独的存储类来存储日期和/或时间,但SQLite 可以将日期和时间存储为TEXT、REAL 或INTEGER 值。

存储类

日期格式

文本

格式为“YYYY-MM-DD HH:MM:SS.SSS”的日期。

真实的

从BC 4714 年11 月24 日中午GMT 开始的天数。

整数

自1970 年1 月1 日00:00:00 UTC 以来的秒数。

系统架构

在内部,SQLite 由以下组件组成:内核、SQL 编译器、后端和附加组件。通过利用虚拟机和虚拟数据库引擎(VDBE),SQLite 可以更轻松地调试、修改和扩展SQLite 内核。所有SQL 语句都被编译成可以在SQLite 虚拟机中执行的可读程序集。 SQLite 支持最大2 TB 的数据库,每个数据库完全存储在单个磁盘文件中。这些磁盘文件可以在具有不同字节顺序的计算机之间移动。该数据以B+树数据结构的形式存储在磁盘上。 SQLite根据这个文件系统获取其数据库权限。

公共接口(Interface) : SQLite库的大部分公共接口都是通过main.c、legacy.c和vdbeapi.c源文件中的函数实现的。这些函数依赖于一些分散在其他文件中的程序,因为在这些文件中它们可以访问文件范围的数据结构词法分析器(Tokenizer) : 当执行包含SQL 语句的字符串时,接口程序必须将字符串传递给tokenizer。 Tokenizer 的任务是将原始字符串分割成单独的标识符(令牌),并将这些标识符传递给解析器。 解析器的工作是将特定的标识符分配给指定上下文中的标识符。意义。 SQLite 的语法解析器是使用Lemon LALR(1) 解析器生成器生成的。 Lemon 与YACC/BISON 执行相同的工作,但它使用不同的输入语法,不易出错。代码生成器: 语法分析器将标识符组装成完整的SQL 语句后,调用代码生成器生成虚拟机代码来执行SQL 语句请求的工作。虚拟机(Virtual Machine): 代码生成器生成的代码由虚拟机执行。虚拟机实现了专门为操作数据库文件而设计的抽象计算引擎。它有一个存储中间数据的内存堆栈,每条指令包含一个操作码和不超过三个附加操作数。 B-Tree (B-Tree) : SQLite 数据库以B-tree 的形式存储在磁盘上。 B 树的实现位于源文件btree.c 中。页面缓存(Page Cache) : B-tree模块是一个固定大小的块,从磁盘请求信息。默认块大小为1024 字节,但可以在512 到65536 字节之间变化。页缓存负责读取、写入和缓存这些数据块。页缓存还提供回滚和原子提交的抽象,并管理数据文件的锁定。 操作系统接口: 为了提供POSIX 和Win32 操作系统之间的可移植性,SQLite 使用抽象层来提供操作系统接口实用程序(Utilities) : 提供了util.pagecache。包含内存分配和字符串比较函数的c 实用程序类。还有一些通用的Hash运算和Unicode转换子程序的测试代码(Test Code):SQLite提供了测试解决方案。主代码文件中有很多assert()语句。另外,源文件test1.c通过test5.c和md5.c实现了一些仅用于测试目的的扩展。 os_test.c后端接口用于模拟断电来验证页缓存的崩溃恢复机制。

总结

总体来说,相比H2数据库,兼容的数据库更多,支持服务器模式。 SQLite的性能比H2差,但是并发性没那么好。另外,SQLite一般使用C API接口进行访问,而H2则支持JDBC。并且可以在大多数主流平台上使用。对于C\C++\C#应用程序,使用SQLite是更好的选择。对于Java应用程序来说,H2是一个不错的选择。

比较项目

SQLite

H2数据库引擎

脚印

350KiB

1MB

许可协议

公共领域

Dual: 修改版MPL 1.1/EPL 1.0(商业友好)

自容器

单个文件

无服务器

服务器模式

零配置

交易处理

指数

(B 树、R 树、全文)

(B 树、树、哈希、全文)

MySQL 兼容性

(并非100%兼容)

与其他数据库兼容

MySQL、PostgreSQL、Oracle、MSSQL、DB2、HSQLDB 和Derby

加密

内存数据库

用户评论

H2 与SQLite
歆久

这篇文章写的真棒!让我对H2数据库了解得更深入了,之前一直用SQLite,突然发现H2还有很多优势呢!现在开始学习H2,期待能提升开发效率。

    有13位网友表示赞同!

H2 与SQLite
巷陌繁花丶

作为一名资深开发者,我不太认同文章的观点。SQLite虽然简单易用,但性能的确有限,H2确实可以提供更好的解决方案,尤其是在需要高并发场景下.

    有15位网友表示赞同!

H2 与SQLite
单身i

对于初学者而言,SQLite 的上手速度是真的快!不过想要更强大的功能,学习H2也是必要的。这篇文章总结得很全面,帮助我更好地理解了两种数据库之间的区别。

    有10位网友表示赞同!

H2 与SQLite
鹿先森,教魔方

我一直觉得 SQLite太过于依赖文件存储,有些不够灵活。而 H2 可以嵌入到Java应用程序中,更容易管理数据,也更方便进行调试,确实在一些方面更加优越!

    有9位网友表示赞同!

H2 与SQLite
病态的妖孽

虽然H2的性能明显优于SQLite,但在某些小型项目中,SQLite的简单易用性更有优势。这篇文章没有很好地阐述不同的场景下使用哪种数据库比较合适。

    有7位网友表示赞同!

H2 与SQLite
予之欢颜

我之前开发web应用时用的是SQLite,但后来发现它的连接数有限制,影响了项目的性能。现在测试H2感觉不错,功能更强大,也更加稳定! 这篇文章真是太及时了!

    有15位网友表示赞同!

H2 与SQLite
折木

对于我这样的初学者来说,这个对比有点复杂,希望作者能将比较点细化一些,更容易理解每个方面差别有多大。

    有14位网友表示赞同!

H2 与SQLite
仅有的余温

我一直对嵌入式数据库感兴趣,这篇介绍H2的博客让我更了解这种类型的数据库。现在去研究一下如何用H2来构建我的项目了!

    有6位网友表示赞同!

H2 与SQLite
雨后彩虹

SQLite和H2各有优缺点,这篇文章比较全面地分析了两者之间的差异,帮助我进一步选择适合自己项目的数据库。

    有5位网友表示赞同!

H2 与SQLite
强辩

我觉得文章里提到H2的安全性比SQLite更强这一点不太准确,任何数据库都需要加强保护措施才行。

    有17位网友表示赞同!

H2 与SQLite
哥帅但不是蟋蟀

我特别喜欢文章结尾提到的学习资源,这些链接很实用,我可以借此学习更多的数据库知识!

    有15位网友表示赞同!

H2 与SQLite
Edinburgh°南空

H2虽然有更高的性能需求,但为了获得更好的可靠性和安全性,我觉得还是值得的!这篇文章让我更想去尝试H2了!

    有17位网友表示赞同!

H2 与SQLite
剑已封鞘

我一直觉得SQLite太简单,缺乏一些高级功能。这篇文章让我看到H2可以提供更多更完善的功能,比如分布式存储和事务操作,真是开阔我的眼界!

    有6位网友表示赞同!

H2 与SQLite
珠穆郎马疯@

这篇blog虽然很客观地描述了 H2 和 SQLite 的差异,但我还是希望作者能对两种数据库的应用场景进行深入分析,以便我更好地做出选择。

    有18位网友表示赞同!

H2 与SQLite
孤自凉丶

这篇文章对我来说特别有用,我一直处于探索不同数据库阶段。通过比较H2和SQLite,我更加清晰地了解了自己的需求!

    有8位网友表示赞同!

H2 与SQLite
回忆未来

以前我都觉得 SQLite 就足够使用了,看完这篇博客发现 H2 的优势还真不少!我现在就开始研究一下如何将其应用到我的项目中去。

    有13位网友表示赞同!

H2 与SQLite
搞搞嗎妹妹

虽然文章介绍了H2的优点,但我仍然希望作者能更详细地讲解 H2 的复杂性问题。毕竟使用更复杂的数据库可能并不适合所有人

    有6位网友表示赞同!

H2 与SQLite
红尘烟雨

这篇文章帮我厘清了我对H2和SQLite的认识!原来两者不仅仅是性能上的差距,还是在功能和应用场景上有所不同。

    有14位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/139014.html

(0)
小su's avatar小su
上一篇 2024年9月18日 下午4:51
下一篇 2024年9月18日 下午4:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注