简介
H2 数据库是一个用 Java 开发的嵌入式(内存级别)数据库,它本身只是一个类库,也就是只有一个 jar 文件,可以直接嵌入到项目中。
特点
- 非常快,开源,JDBC API
- 嵌入式和服务器模式(基于磁盘或内存中的数据库)
- 事务支持,多版本并发
- 基于浏览器的控制台应用程序
- 加密数据库
- 全文搜索
- 占用空间小的纯 Java 应用,大约 2.5 MB
- ODBC 驱动程序
应用场景
- 适合 demo 或小型应用,无需部署重型数据库
- 同应用程序一起打包发布,方便服务迁移
- 单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态
- 内存数据库。缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表
数据类型
类型描述 | 对应数据库中类型 |
---|---|
整数 | INT |
布尔型 | BOOLEAN |
微整数 | TINYINT |
小整数 | SMALLINT |
大整数 | BIGINT |
标识符 | IDENTITY |
货币数 | DECIMAL |
双精度实数 | DOUBLE |
实数 | REAL |
时间 | TIME |
日期 | DATE |
时间戳 | TIMESTAMP |
二进制 | BINARY |
其他类型 | OTHER |
可变字符串 | VARCHAR |
不区分大小写可变字符串 | VARCHAR_IGNORECASE |
字符 | CHAR |
二进制大对象 | BLOB |
文本大对象 | CLOB |
通用唯一标识符 | UUID |
数组 | ARRAY |
运行模式
内嵌模式(Embedded Mode)
最简单最快捷的一种连接方式,应用在 JVM 中启动 H2 数据库并通过 JDBC 连接。
支持数据持久化和内存两种方式,对同时开启的数据库数量和数据库连接数量没有限制。
缺点是数据库可能只在任何时候在一个虚拟机(和类加载器)中打开。
服务器模式(Server Mode)
使用 JDBC 或 ODBC 在 TCP/IP 上的远程连接。
支持数据持久化和内存两种方式,对同时开启的数据库数量和数据库连接数量没有限制。
H2 数据库可以部署在不同的 JVM 或不同的物理机中,多个应用可以通过连接 H2 服务器同时连接到 H2 数据库。
因为数据需要通过 TCP/IP 协议远程传输,因此服务器模式获取数据比嵌入式模式慢。
混合模式
混合模式结合了嵌入式模式和服务器模式的特点,第一个应用通过嵌入式模式打开 H2 数据库,同时将数据库开启服务器模式,其他应用可以远程连接到数据库。数据库服务器的开启和关闭都在第一个应用中完成。
连接方式
以嵌入式 (本地) 连接方式连接 H2 数据库
这种连接方式默认情况下只允许有一个客户端连接到 H2 数据库。当有客户端连接到 H2 数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再连接了。
语法:
jdbc:h2:[file:][<path>]<databaseName>
例子:
// 连接位于用户目录下的test数据库
jdbc:h2:~/test
jdbc:h2:file:/data/sample
// Windows only
jdbc:h2:file:E:/H2/gacl
使用 TCP/IP 的服务器模式 (远程连接) 方式连接 H2 数据库 (推荐)
这种连接方式和其他数据库连接方式类似,是基于 Service 的形式进行连接的,因此允许多个客户端同时连接到 H2 数据库。
语法:
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
例子
jdbc:h2:tcp://localhost/~/test
搭建 H2 数据库控制台
从官网 下载程序
Windows 下启动软件
解压程序,进入 bin
目录,点击 h2.bat
或者 h2w.bat(后台)
运行软件。
Linux 下启动软件
用 unzip
命令解压,然后在 h2/bin
目录下,运行 ./h2.sh
文件来启动数据库服务,但不建议这样直接启动,因为需要带一些参数,需要进行如下修改:
# 1. 复制 h2.sh 为 h2_server.sh 文件:
cp h2.sh h2_server.sh
# 2. 用 vim 编辑 h2_server.sh,如下:
!/bin/sh
dir=$(dirname"$0")
java -cp "$dir/h2-2.1.212.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -webPort 8082 "$@"
# 3. 说明:
org.h2.tools.Server: 以服务器模式启动;
-tcpAllowOthers: 允许远程机器通过TCP方式访问;
-webAllowOthers: 允许远程机器通过浏览器访问;
-webPort 8082: 默认的访问端口(8082为未被占用的端口,如果此端口已经被其他端口占用,则改为其他端口);
# 4. 具体的运行方式
# chmod 修改启动文件权限:
chmod +x h2_server.sh
# 输入如下命令后台运行:
nohup ./h2_server.sh & 回车
# 说明:nohup 命令可以在我们退出账户之后继续运行相应的进程,nohup 就是不挂起的意思(no hang up),& 表示让该进程实现后台运行。
# 该命令的一般形式为:
nohup command & 回车
Spring Boot 集成 H2 数据库
引入依赖
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
application.yml
spring:
datasource:
# 使用内存数据库,项目重启数据就没了,库名:testdb
url: jdbc:h2:mem:testdb
# 使用持久化数据库,存储在文件中
#url: jdbc:h2:file:E:\IdeaProjects\toy\emoticon\src\main\resources\h2database;DB_CLOSE_DELAY=-1;
driver-class-name: org.h2.Driver
username: sa
password: 123
h2:
console:
path: /h2-console
enabled: true
settings:
# 开启 console 跟踪,方便调试,默认 false
trace: true
# 允许远程访问 console,默认 false
web-allow-others: true
jpa:
database: h2
hibernate:
ddl-auto: update
show-sql: true
logging:
file:
path: D:/Cache/project/${spring.application.name}
初始化数据库
利用 sql 文件初始化
在 application.yml
文件中添加
spring:
sql:
# 数据初始化设置
init:
#进行该配置后,每次启动程序,程序都会运行 resources/db/schema.sql 文件,对数据库的结构进行操作
schema-locations: classpath:db/schema.sql
#进行该配置后,每次启动程序,程序都会运行 resources/db/data.sql 文件,对数据库的数据操作
data-locations: classpath:db/data.sql
利用 Spring Data Jpa 初始化
借用 Spring Data Jpa
的注解,服务启动时自动创建数据库
Note
- 控制台地址:http://localhost:8080/h2-console
- JDBC URL 默认是
jdbc:h2:~/test
,需要修改成spring.datasource.url
的值
尾巴
Reference