H2 数据库基础教程之一

大纲

前言

在开发或学习时,有时候想编写一个数据库操作的小 Demo,但又不想利用 MySQL、Oracle 等数据库进行建库建表操作,因为只想写个小案例,感觉没必要弄个很大很麻烦的数据库。而且这个案例中的数据用完之后就不再需要了,所以也不需要进行数据的持久化操作。那有没有什么方案可以满足这个需求呢?答案是肯定的,H2 是一款内存数据库,适合在学习阶段、开发阶段调试代码使用,并不适用于生产阶段,可以满足学习与调试代码的需求。

H2 基础使用

H2 的介绍

H2 简介

H2 数据库是一个用 Java 开发的内嵌式 (内存级别) 关系型数据库,它本身只是一个类库,也就是只有一个 Jar 文件,可以直接嵌入到 Java 项目中。H2 数据库又被称为内存数据库,因为它支持在内存中创建数据库和表。所以如果使用 H2 数据库的内存模式,那么创建的数据库和表都只是保存在内存中,一旦服务器重启,那么内存中的数据库和表将不存在了。

H2 优点

  • 纯 Java 编写,不受平台的限制;
  • 只有一个 Jar 文件,适合作为嵌入式数据库使用;
  • H2 提供了一个十分方便的 Web 控制台用于操作和管理数据库;
  • 功能完整,支持标准 SQL 和 JDBC,麻雀虽小五脏俱全;
  • 支持内嵌模式、服务器模式和集群;

H2 用途

H2 主要有如下三个用途:

  • 最常使用的用途就在于可以同应用程序一起打包发布,可以非常方便地存储少量的结构化数据;
  • 可以用于单元测试,H2 启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态;
  • 可以作为缓存,即当内存数据库使用,作为 NoSQL 的一个补充。当某些场景下数据模型必须为关系型,可以拿它充当 Memcached 使用,作为后端 MySQL/Oracle 的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表等。

H2 与其他数据库对比

提示

完整的数据库对比图表请点击 这里 查看。

H2 的 3 种运行模式

内嵌模式 (Embedded Mode)

使用 JDBC 的本地连接。在内嵌模式下,应用程序和 H2 数据库处在同一个 JVM 中,应用程序通过 JDBC 连接数据库。内嵌模式可以实现持久化,但同一时刻只能有一个客户端连接数据库。内嵌模式是最快也是最容易的连接方式,性能也比较好。缺点是数据库无论什么时候,都只能在一个虚拟机(和类加载器)中打开。内嵌模式与所有模式一样,支持持久化和内存数据库。对并发打开数据库的数量或者打开连接的数量没有限制。

服务器模式 (Server Mode)

使用 JDBC 或 ODBC 在 TCP/IP 基础上的远程连接。使用服务器模式和内嵌模式一样,只不过它可以跑在另一个进程里。服务器模式比内嵌模式慢,因为所有数据都通过 TCP/IP 协议传输。与所有模式一样,支持持久化和内存数据库。对每个数据库服务器并发打开的数据库数量或者打开连接的数量没有限制。

混合模式 (Mixed Mode)

混合模式是内嵌模式和服务器模式的组合。混合模式集合了内嵌模式和服务模式的优点,使得数据库的性能和内嵌模式一样高,同时又支持多个应用同时连接同一个数据库。第一个应用通过内嵌模式与数据库建立连接,同时也作为一个独立的服务器启动,而其他的应用 (运行在不同的进程或是虚拟机上) 可以同时访问同样的数据库。第一个应用程序的本地连接与内嵌模式的连接性能一样快,而其它应用的连接性能理论上会差一点。H2 服务器可以从应用程序内(使用 H2 服务器的 API)启动或停止,或自动(自动混合模式)。当使用自动混合模式时,所有想要连接到数据库的客户端(无论是本地连接还是远程连接)都可以使用完全相同的数据库 URL 来实现连接。值得注意的是,H2 在混合模式下不支持内存数据库,即数据库必须持久化。

H2 的 3 种连接方式

  • 第一种连接方式,以内嵌模式 (内存) 连接 H2 数据库。H2 支持在内存中创建数据库和表。特别注意,如果使用 H2 数据库的内存模式,那么创建的数据库和表都只是保存在内存中,一旦服务器重启,那么内存中的数据库和表就不存在了。
连接语法连接示例说明
jdbc:h2:mem:<databaseName>jdbc:h2:mem:testDb数据库的数据只存在内存中
  • 第二种连接方式,以内嵌模式 (本地文件) 连接 H2 数据库。这种连接方式在默认情况下,同一时刻只允许有一个客户端连接到 H2 数据库。当有客户端连接到 H2 数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再建立连接。
连接语法连接示例说明
jdbc:h2:[file:][<path>]<databaseName>jdbc:h2:~/testDb,连接位于当前用户目录下的 testDb 数据库
jdbc:h2:file:./testDb,连接位于当前程序所在目录下的 testDb 数据库
jdbc:h2:file:/h2/data/testDb,适用于 Linux 系统
jdbc:h2:file:E:/h2/data/testDb,适用于 Windows 系统
会将数据库的数据持久化到文件中
jdbc:h2:[file:][<path>]<databaseName>;AUTO_SERVER=TRUEjdbc:h2:~/testDb;AUTO_SERVER=TRUE
jdbc:h2:file:./testDb;AUTO_SERVER=TRUE
jdbc:h2:file:/h2/data/testDb;AUTO_SERVER=TRUE
jdbc:h2:file:E:/h2/data/testDb;AUTO_SERVER=TRUE
启用混合模式,允许多个客户端同时连接同一个 H2 数据库,该参数不支持在内存中运行的 H2 数据库
  • 第三种连接方式,使用支持 TCP/IP 的服务器模式 (远程连接) 连接 H2 数据库。这种连接方式和其他数据库的连接方式类似,是基于 Service 的形式进行连接的,因此允许多个客户端同时连接到 H2 数据库。
连接语法连接示例说明
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>jdbc:h2:tcp://localhost/~/testDb
jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName>jdbc:h2:ssl://localhost/~/testDb支持 SSL 连接

安装 H2 的 Web 控制台

H2 的 Web 控制台是一个基于浏览器的 GUI 数据库管理工具,可以很方便地管理 H2 数据库。它的作用就相当于 PhpMyAdmin,一般情况下可以在开发环境启动 H2 的 Web 控制台。

H2 数据库下载地址

可以在官网上选择一个版本进行下载,可以下载安装器或者直接下载软件包。这里建议选择 All Platforms 版本,因为解压文件后,既可用于 Windows 平台,也可用于 Linux 平台 (如下图所示)。

H2 软件包目录结构

1
2
3
4
5
6
7
8
9
10
11
h2
 |---bin
 | |---h2-2.1.214.jar  //H2数据库的Jar包(驱动也在里面)
 | |---h2.bat   //Windows控制台启动脚本
 | |---h2.sh   //Linux控制台启动脚本
 | |---h2w.bat  //Windows控制台启动脚本(不带黑屏窗口)
 |---docs   //H2数据库的帮助文档(内有H2数据库的使用手册)
 |---service   //通过Wrapper包装成服务
 |---src   //H2数据库的源代码
 |---build.bat  //Windows构建脚本
 |---build.sh  //Linux构建脚本

启动 H2 的 Web 控制台

Linux 平台启动

在 Linux 环境下,首先用 unzip 命令解压下载到的文件,然后在 bin 目录下,执行 h2.sh 来启动 H2 的 Web 控制台。值得一提的是,一般不建议这样直接启动,因为最好是带一些命令参数来启动 Web 控制台。

命令参数说明
org.h2.tools.Shell 以终端方式启动 H2 的 Web 控制台,需要根据提示输入 DRIVER CLASS、URL、USER NAME、PASSWORD 等连接信息。以终端方式启动后,可以执行数据库的备份、还原、SQL 导出,SQL 导入等操作,详细教程请看 这里
org.h2.tools.Console 启动 H2 的 Web 控制台
org.h2.tools.Server 以服务器模式启动 H2 的 Web 控制台
-tcpAllowOthers允许远程机器通过 TCP 方式访问数据库
-webAllowOthers允许远程机器访问 H2 的 Web 控制台
-webPort 8082指定 Web 控制台的访问端口,默认是 8082
-webSSL启用 SSL 加密连接

bin 目录下创建新的启动脚本(如 h2_server.sh),内容如下(三种启动方式可以任意选择一种)

1
2
3
#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-2.1.214.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Shell "$@"
1
2
3
#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-2.1.214.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console -webAllowOthers -webPort 8082 "$@"
1
2
3
#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-2.1.214.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -webPort 8082 "$@"

启动数据库服务

1
2
3
4
5
6
7
8
# 新的启动脚本授权
$ chmod +x h2_server.sh

# 前台运行新的启动脚本
$ bash h2_server.sh

# 或者后台运行新的启动脚本
$ nohup h2_server.sh &

正常启动 Web 控制台(服务器模式)后,终端输出的日志信息如下

1
2
3
Web Console server running at http://192.168.1.106:8082 (others can connect)
TCP server running at tcp://192.168.1.106:9092 (others can connect)
PG server running at pg://192.168.1.106:5435 (only local connections)

Windows 平台启动

进入到 H2 解压后的 bin 目录下,点击 h2.bat 或者 h2w.bat,直接运行软件。值得一提的是,点击 h2w.bat 后,此方式会在后台静默运行 H2 的 Web 控制台。

访问 H2 的 Web 控制台

使用浏览器访问 H2 的 Web 控制台,URL 是 http://127.0.0.1:8082,也可以使用本机的 IP 地址(例如 http://192.168.1.106:8082

使用 H2 的数据库

创建 H2 数据库

H2 成功启动后,在系统桌面底部的状态栏右下角会有一个黄色小图标(如下图红色箭头所指的位置)

可以在桌面状态栏右下角的黄色小图标处,右键点击 H2 控制台的图标,选择 Create a new database...,即可以创建一个新的数据库

出现如下窗口后,填写数据库文件的存放路径(例如 ~/demo,支持使用相对路径或者绝对路径)、访问数据库的用户名和密码,点击 Create 按钮,则会在用户目录下创建对应的数据库文件(例如 demo.mv.db

提示

    1. H2 数据库创建后,可能还会看到一个 demo.trace.db 文件,它是 H2 数据库的错误日志文件。
    1. H2 数据库的文件名称 demo.mv.db,之所以里面有 mv,这是因为高版本的 H2 存储引擎默认为 mvStore

连接 H2 数据库

提示

  • H2 数据库连接成功后,会自动在用户目录下创建 .h2.server.properties 配置文件,用于保存数据库的历史连接信息。

用鼠标左键点击在桌面状态栏右下角的黄色小图标,此时会在浏览器打开 H2 的 Web 控制台界面(默认地址是 http://127.0.0.1:8082),填写 JDBC URL、用户名和密码后,点击 Connect 按钮就可以连接 H2 数据库

H2 数据库成功连接后,就会自动进入数据库的管理界面

输入 show databases;show tables; SQL 语句,可以显示 H2 默认的数据库和表名

使用 H2 的 Web 控制台

设置超级管理员密码

H2 数据库连接成功后,会自动在用户目录下创建 .h2.server.properties 配置文件(如下),用于保存数据库的历史连接信息。因此,可以手动编辑 .h2.server.properties 配置文件,然后添加 webAdminPassword 参数来指定 H2 的超级管理员密码。

参数说明
webAllowOthers允许远程机器访问 H2 的 Web 控制台
webPort指定 Web 控制台的访问端口,默认是 8082
webSSL启用 SSL 加密连接
webAdminPassword指定超级管理员密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
webSSL=false
webAdminPassword=admin
webAllowOthers=true
webPort=8082
10=Generic DB2|com.ibm.db2.jcc.DB2Driver|jdbc\:db2\://localhost/test|
11=Generic Oracle|oracle.jdbc.driver.OracleDriver|jdbc\:oracle\:thin\:@localhost\:1521\:XE|sa
12=Generic MS SQL Server 2000|com.microsoft.jdbc.sqlserver.SQLServerDriver|jdbc\:microsoft\:sqlserver\://localhost\:1433;DatabaseName\=sqlexpress|sa
13=Generic MS SQL Server 2005|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://localhost;DatabaseName\=test|sa
14=Generic PostgreSQL|org.postgresql.Driver|jdbc\:postgresql\:test|
15=Generic MySQL|com.mysql.cj.jdbc.Driver|jdbc\:mysql\://localhost\:3306/test|
16=Generic MariaDB|org.mariadb.jdbc.Driver|jdbc\:mariadb\://localhost\:3306/test|
17=Generic HSQLDB|org.hsqldb.jdbcDriver|jdbc\:hsqldb\:test;hsqldb.default_table_type\=cached|sa
18=Generic Derby (Server)|org.apache.derby.client.ClientAutoloadedDriver|jdbc\:derby\://localhost\:1527/test;create\=true|sa
19=Generic Derby (Embedded)|org.apache.derby.iapi.jdbc.AutoloadedDriver|jdbc\:derby\:test;create\=true|sa
0=Generic JNDI Data Source|javax.naming.InitialContext|java\:comp/env/jdbc/Test|sa
1=Generic Teradata|com.teradata.jdbc.TeraDriver|jdbc\:teradata\://whomooz/|
2=Generic Snowflake|com.snowflake.client.jdbc.SnowflakeDriver|jdbc\:snowflake\://accountName.snowflakecomputing.com|
3=Generic Redshift|com.amazon.redshift.jdbc42.Driver|jdbc\:redshift\://endpoint\:5439/database|
4=Generic Impala|org.cloudera.impala.jdbc41.Driver|jdbc\:impala\://clustername\:21050/default|
5=Generic Hive 2|org.apache.hive.jdbc.HiveDriver|jdbc\:hive2\://clustername\:10000/default|
6=Generic Hive|org.apache.hadoop.hive.jdbc.HiveDriver|jdbc\:hive\://clustername\:10000/default|
7=Generic Azure SQL|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://name.database.windows.net\:1433|
8=Generic Firebird Server|org.firebirdsql.jdbc.FBDriver|jdbc\:firebirdsql\:localhost\:c\:/temp/firebird/test|sysdba
9=Generic SQLite|org.sqlite.JDBC|jdbc\:sqlite\:test|sa
20=Generic H2 (Server)|org.h2.Driver|jdbc\:h2\:tcp\://localhost/~/test|sa
21=Generic H2 (Embedded)|org.h2.Driver|jdbc\:h2\:~/demo|root

提示

若没有找到 .h2.server.properties 文件,以 Web-Server 方式首次启动 H2 后,浏览器打开 Web 控制台,点击 Save 按钮后就会自动创建对应的配置文件。

使用 H2 的配置界面

使用浏览器访问 H2 的 Web 控制台,然后点击 Preferences,填写超级管理员密码后,就可以进入 H2 的配置界面

进入到 H2 的配置界面后,可以设置远程访问、端口号等信息

使用 H2 的工具界面

使用浏览器访问 H2 的 Web 控制台,然后点击 Tools,填写超级管理员密码后,就可以进入 H2 的工具界面

进入 H2 的工具界面后,可以对 H2 数据库进行备份、还原、恢复、集群、运行脚本、删除文件等操作

H2 进阶使用

第三方软件连接 H2 数据库

H2 除了可以使用自身的 Web 控制台管理数据库之外,还可以使用 Navicat、DBeaver 这样的数据库软件来管理。这里以开源的 DBeaver 数据库管理软件举例,介绍如何使用第三方软件连接 H2 数据库。

  • 在 DBeaver 的主界面新建数据库连接,数据库类型选择 H2 Embedded V.2,即使用内嵌模式连接 H2 数据库

特别注意

  • 内嵌模式只允许有一个客户端连接 H2 数据库,可以简单理解为只允许有一个应用访问数据库文件。
  • 如果 H2 数据库已经以服务器模式启动了,那么 DBeaver 的数据库类型可以选择 H2 Server,服务器模式支持多个客户端同时连接 H2 数据库。

  • 填写 JDBC URL、用户名和密码,然后点击 测试连接 按钮或者 完成 按钮即可

  • 成功连接 H2 数据库后,就可以看到之前创建的数据库表

附录

以下表格是 H2 数据库在不同模式下的 URL 连接字串,参考自:H2 数据库使用简介

参考资料