大家好,我是只谈技术不剪发的 Tony 老师。今天又给大家介绍一款基于 Java 的嵌入式关系型数据库:H2。为什么说“又”呢?因为前文刚刚介绍了一款基于 Java 的嵌入式关系型数据库:Apache Derby。
H2 简介
H2 是一个开源的嵌入式关系型数据库,完全使用 Java 语言实现,并遵循 Mozilla Public License Version 2.0 或者 Eclipse Public License 1.0 协议。H2 第一次发布于 2005 年,最初由 Thomas Mueller 创建,他也是另一个嵌入式数据库 HSQLDB 的创始人。目前,H2 的最新版本为 1.4.200 (2019-10-14);源代码可以从 GitHub 下载。
H2 数据库的主要特点包括:
- 非常快速、开源、支持 SQL 标准和 JDBC API;
- 支持嵌入式和服务器模式,支持集群部署,支持磁盘存储和内存存储,支持只读数据库和临时表;
- 支持事务(ACID)和多版本并发控制(MVCC),支持并发连接、表级锁;
- 提供了基于浏览器的控制台应用程序;
- 支持数据库加密(AES),SHA-256 密码加密,加密函数,SSL 连接;
- 全文检索;
- 纯 Java 实现,jar 文件大小仅有 2 MB 左右,占用的内存很小;
- ODBC 驱动;
- 基于成本的优化器,复杂查询的遗传算法,不需要任何配置;
- 支持可滚动、可更新的查询结果集,大型结果集,结果集外部排序,函数可以返回结果集;
- 支持多个模式(schema),提供了系统模式 information schema;
- 级联的参照完整性/外键约束,检查约束;
- 内连接和外连接查询,子查询,只读视图和内联视图;
- 触发器和 Java 函数/存储过程;
- 大量内置函数,包括 XML 和无损数据压缩函数;
- 支持广泛的数据类型,包括大对象(BLOB/CLOB)和数组类型;
- 序列和自增字段,计算列(可以用于创建函数索引);
- ORDER BY、GROUP BY、HAVING、UNION、OFFSET / FETCH(包括 PERCENT 和 WITH TIES)、LIMIT、TOP、DISTINCT / DISTINCT ON (…);
- 窗口函数;
- 支持排序规则(Collation)包括 ICU4J 库;
- 支持用户和角色;
- 支持各种数据库兼容模式:IBM DB2、Apache Derby、HSQLDB、MS SQL Server、MySQL、Oracle 以及 PostgreSQL;
- 提供了防止 SQL 注入的方法;
- 用户密码认证使用 SHA-256 和 salt;
- 对于服务器连接模式,用户密码永远不会使用明文在网络上传输(即使使用非安全的连接也是如此;不过这个规则只适用于 TCP 服务器,而不适用于 H2 控制台;另外,它也不适用于在 URL 中直接指定密码的情况);
- 所有的数据库文件(包括用于备份数据的脚本文件)都可以使用 AES-128 加密算法进行加密;
- 远程连接的 JDBC 驱动支持 TLS TCP/IP 连接;
- 内置的 web 服务器支持 TLS 连接;
- 发送数据库密码时可以使用字符数组替换字符串;
- 多种索引类型(b-tree、tree、hash);
- 支持多维索引;
- 支持 CSV 文件导入导出;
- 支持外部链接表,以及内置的虚拟“范围”表;
- 支持 EXPLAIN PLAN 语句,支持高级跟踪选项;
- 支持延迟或者禁用数据库关闭,提高性能;
- 提供了基 于 Web 控制台应用程序(多语言界面),支持命令自动补全功能;
- 支持导出数据库的脚本文件;
- 提供了一个恢复工具,可以用于备份数据库;
- 支持类似于 MySQL 的变量;
- 预编译语句的自动重编译;
- 使用少量的数据库文件;
- 为每个记录和日志条目增加了校验和,保证了数据的完整性;
- 良好的测试(高代码覆盖率,随机压力测试)。
可以看出,H2 的确是一个轻量但功能强大的数据库引擎。就让我们赶紧试用一下吧!
下载安装
打开 H2 官方网站提供的下载页面。
最新版本的 H2 需要 Java 7 以上运行环境,选择最新版本 Platform-Independent Zip 文件进行下载解压;Windows 操作系统可以使用 Windows Installer 进行安装。
解压缩或者安装之后的目录如下:
安装目录包含了一下内容:
- bin 目录包含了 jar 文件和启动脚本;
- docs 目录包含了文档和 Javadoc;
- service 目录包含了将 H2 配置为 Windows 服务的安装和管理脚本;
- src 目录包含了所有的源码文件。
H2 引擎基于 Java 环境运行,需要先安装 JDK 7 或者 JRE 7 以上版本,可以点击下载安装并配置环境变量 JAVA_HOME,将 JDK 的 bin 目录添加到 PATH 环境变量,然后使用java -version
查看当前 Java 版本。
C:\Users\dongx> java -version
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
接下来就可以运行 bin 目录下的 h2.bat(Windows)或者 h2.sh(Linux)脚本启动 H2 控制台应用程序。H2 控制台应用可以通过浏览器访问数据库,包括 H2 数据库和其他支持 JDBC API 的数据库。
然后打开浏览器,输入地址:http://localhost:8082/ 。
H2 控制台应用支持中文语言界面,以及不同的数据库连接。我们选择中文界面,保留默认值并点击下面的“连接”就可以连接 H2 数据库了。
整个界面非常简单,页面左侧是数据库的连接信息和对象,默认在操作系统当前目录下创建了一个 test 数据库(test.mv.db)。
执行 SQL 语句
点击“样例SQL脚本”可以自动将示例脚本复制到命令区域。
然后点击“执行”或者绿色的三角运行 SQL 命令,界面左侧会增加一个 TEST 表节点,命令区域下面会显示运行的结果。
查看帮助
在命令区域输入 help 并点击运行,可以查看 SQL 命令帮助。
运行 SQL 脚本
H2 支持调用 SQL 脚本,命令区域输入执行 RUNSCRIPT FROM ‘file’ 运行指定的文件:
RUNSCRIPT FROM '~/myfile.sql'
RUNSCRIPT 命令会执行该脚本文件中的内容。
生成 DDL 语句
在命令区域输入 SCRIPT 命令查看数据库的 DDL 语句。
SCRIPT 命令支持许多选项,例如 SCRIPT TO ‘filename’ 可以将 DDL 语句保存到指定文件中,SCRIPT NODATA 可以避免生成插入数据的 INSERT 语句。
📝关于 H2 支持的详细命令介绍,可以参考官方文档。
断开数据库连接
点击界面左上的断开连接按钮退出当前数据库连接。
连接模式
H2 支持三种不同的连接模式:嵌入式(Embedded)、服务器模式(Server)以及混合模式(Mixed)。所有的模式都支持内存或者磁盘持久化存储。
嵌入式模式中的应用通过 JDBC 在同一个 JVM 中打开数据库。这是最快速、最容易的连接模式,缺点就是一个数据库同一时间只能在一个虚拟机中打开。这种方式不限制同时打开的数据库数量,也不限制活动连接数。
在嵌入式模式中,执行 SQL 命令的应用程序线程可以执行数据库 I/O 操作。应用程序不能中断这些线程,否则会导致数据库损坏,因为 JVM 会在线程中断时关闭 I/O 处理。此时需要考虑使用其他方式控制应用程序。如果可能发生中断,可以尝试使用 async 文件系统,但不一定确保安全。因此,推荐使用服务器模式,客户端线程的中断不会影响数据库。
服务器模式(也叫远程模式或者客户端/服务器模式)中的应用程序通过 JDBC 或者 ODBC 远程连接到数据库。这种模式需要在同一个或者不同的虚拟机或服务器上启用 H2 服务,多个应用程序通过连接该服务,可以同时连接到相同的数据库。在系统内部,服务器进程以嵌入式模式连接到数据库。
服务器模式比嵌入式模式性能差一些,因为所有的数据都需要通过 TCP/IP 进行传输。
混合模式是嵌入式和服务器模式的组合,第一个应用以嵌入式模式连接到数据库,同时启动一个服务,其他应用(运行在不同的进程或者虚拟机中)通过该服务器连接到数据库。本地连接和嵌入式模式的速度一样,但是远程连接慢一些。
📝关于这三种连接模式的配置和 JDBC URL 设置,可以参考官方文档。
命令行客户端
H2 数据库自带了一个命令行 Shell 工具,输入以下命令调用该工具:
C:\Users\dongx>java -cp "C:\Program Files (x86)\H2\bin\h2-1.4.200.jar" org.h2.tools.Shell
Welcome to H2 Shell 1.4.200 (2019-10-14)
Exit with Ctrl+C
[Enter] jdbc:h2:tcp://localhost/~/test
URL
[Enter] org.h2.Driver
Driver
[Enter] sa
User
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ? Display this help
list Toggle result list / stack trace mode
maxwidth Set maximum column width (default is 100)
autocommit Enable or disable autocommit
history Show the last 20 statements
quit or exit Close the connection and exit
sql>
按照提示输入数据库的连接信息即可。接下来就可以输入各种 SQL 语句了:
sql> select now();
NOW()
2020-09-03 20:54:28.629717
(1 row, 2 ms)
输入 quit 或者 exit 可以退出客户端。
Maven 依赖
如果想要在自己的 Java 程序中使用 H2 数据库,可以添加以下 Maven 依赖:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
最新的版本配置可以查看 Maven Central。
资源文档
如果想要进一步深入了解和学习 H2,可以参考以下资源:
- H2 官方网站;
- H2 官方教程;
- tutorialspoint 在线教程;
- H2 支持的 SQL 命令;
- 管理开发工具:DBeaver、SQuirreL SQL、DbVisualizer。
- H2GIS,基于 H2 的空间数据库。
总结
H2 是一款基于 Java 实现的小巧而强大的关系型数据库,支持嵌入式、客户端/服务器以及混合部署模式。H2 数据库适合嵌入小型应用程序、元数据管理、快速应用开发和测试、内存数据库。
如果觉得文章对你有用,欢迎关注❤️、评论📝、点赞👍!