内存数据库H2实战:介绍、使用以及和Spring Boot集成

什么是H2数据库?

H2数据库[1]的特点:

  • 非常快, 开源,支持 JDBC API
  • 嵌入式和服务器模式; 内存数据库
  • 基于浏览器的 控制台应用程序
  • 占用空间小,jar只有2MB大小

以上只是官网列出的特点。

由于本身是由纯Java。还有跨平台的优势,支持目前常见的大部分平台。

和其他常见数据库之间的对比如下:

使用场景

  • 嵌入式数据库。由于额外的资源占用较少,所以比较适合需要嵌入式数据的场景。
  • 快速数据处理。临时想用SQL来做一些数据的处理的工作,又不想安装MySQL服务器之类的软件,那么H2可以快速投入使用。

SQL的兼容性

所有的数据库引擎行为都会有一定的差异。H2除了支持ANSI SQL标准之外,也尝试对其他数据库做一些兼容[2](MODE=XX)。

比如,MYSQL默认是大小写不敏感,H2是大小写敏感。实际上,H2也支持大小写不敏感,只需要在创建数据库添加参数IGNORECASE=TRUE,比如jdbc:h2:~/test;IGNORECASE=TRUE

需要注意的是,兼容模式不代表所有的差异都已经被处理,实际实现的只有一小部分差异的子集。可以兼容的数据库有DB2,Derby,HSQLDB,MS SQL Server,MySQL,Oracle,PostgreSQL,Ignite。

比如兼容DB2的SQL模式,可以如下来配置:
jdbc:h2:~/test;MODE=DB2

集成Spring Boot和数据源配置

Spring Boot集成其实非常简单,只需要添加依赖和配置数据源即可。

笔者用的是maven来管理依赖,因此在POM文件中添加H2的依赖。由于我同时使用了Druid的数据库连接池,所以也添加了Druid的jar包。

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

注意,这里配置的时候不需要配置版本号,因为在引入spring-boot-dependencies BOM的时候,已经自带了版本号的配置。

比如笔者使用的spring-boot版本是2.4.2,可以看到在spring-boot-dependencies-2.4.2.pom文件中的H2数据库的版本是

1
<h2.version>1.4.200</h2.version>

接下来,我们通过Spring的应用程序属性字段来配置数据源,达到使用H2的效果。笔者用的是application.yaml,配置如下。如果使用application.properties,配置是完全一样的。

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
27
28
29

spring:
datasource:
#Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.
#数据库连接池
type: com.alibaba.druid.pool.DruidDataSource
# 驱动
# Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
driver-class-name: org.h2.Driver
#数据库连接地址
# h2 内存数据库 内存模式连接配置 库名: testdb
url: jdbc:h2:mem:testdb
username: sa
password:
# # 初始化数据表 DDL
# schema: classpath:sql/init.sql
# # 初始化数据 DML
# data: classpath:sql/data.sql

h2:
console:
enabled: true
settings:
# 开启h2 console 跟踪 方便调试 默认 false
trace: true
# 允许console 远程访问 默认false
web-allow-others: true
# h2 访问路径上下文
path: /h2-console

配置完成之后,启动应用程序,数据库就会自动生成。

这是这么做到的呢?

  1. 程序启动时,确保h2*.jar在classpath上
  2. 使用H2的org.h2.Driver
  3. 通过H2的UR(比如:jdbc:h2:~/test)来打开在Home目录下的test数据库
  4. 数据库会由H2自动创建。

由于我们在application.yaml中配置了H2的控制台,因此我们可以通过浏览器连接数据库。在地址栏中输入http://localhost:9001/h2-console就可以进入H2数据的控制台。

注意:红框中的要和配置的保持一致。如果没有配置密码,则直接连Connect就可以进入DB。

进入数据之后,界面主要分为左右两边,左边是数据库,右边是操作区。如下:

如果要想数据保存的话,那么可以将数据库从内存数据库修改到文件系统。

H2的URL有哪些?

内嵌式数据库:

1
2
3
jdbc:h2:~/test 'test' in the user home directory
jdbc:h2:/data/test 'test' in the directory /data
jdbc:h2:./test in the current(!) working directory

内存数据库

1
2
jdbc:h2:mem:test multiple connections in one process
jdbc:h2:mem: unnamed private; one connection

服务器模式,启动服务:

1
java -cp *.jar org.h2.tools.Server

连接:

1
2
jdbc:h2:tcp://localhost/~/test user home dir
jdbc:h2:tcp://localhost//data/test absolute dir

配置H2服务器:

1
2
jdbc:h2:..;MODE=MySQL compatibility (or HSQLDB,...)
jdbc:h2:..;TRACE_LEVEL_FILE=3 log to *.trace.db

结论

本文中,我们考察了H2数据的特点、应用场景、兼容性,以及如何和当下流行的Spring框架集成。可以看出,H2是一款小巧但是完备的数据库,在测试、临时数据处理、内嵌式快速开发上很有特点。

接下来,我将会尽量选择一些有趣的干活内容来尝试写作,可以保证的是,干货满满。

参考:
[1] 官网地址:http://www.h2database.com/html/main.html
[2] H2的SQL兼容性:http://www.h2database.com/html/features.html#compatibility
[3] Spring Aplication Properties:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
[4] https://segmentfault.com/a/1190000020636564