简介

H2 数据库是一个用 Java 开发的嵌入式(内存级别)数据库,它本身只是一个类库,也就是只有一个 jar 文件,可以直接嵌入到项目中。

特点

  • 非常快,开源,JDBC API
  • 嵌入式和服务器模式(基于磁盘或内存中的数据库)
  • 事务支持,多版本并发
  • 基于浏览器的控制台应用程序
  • 加密数据库
  • 全文搜索
  • 占用空间小的纯 Java 应用,大约 2.5 MB
  • ODBC 驱动程序

应用场景

  • 适合 demo 或小型应用,无需部署重型数据库
  • 同应用程序一起打包发布,方便服务迁移
  • 单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态
  • 内存数据库。缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表

数据类型

H2 数据库中的数据类型 - CSDN 博客

类型描述对应数据库中类型
整数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

尾巴