1. H2 数据库

1.1 介绍

H2 数据库是由 Java 语言编写的嵌入式数据库引擎,H2 是基于内存存储的数据库,只需要在项目中引入一个 jar 包文件即可使用,不受平台限制。

H2 数据库占用空间很小,在 Java 虚拟机启动时初始化建立数据库,而在虚拟机关闭时销毁。

1.2 特点

H2 数据库与其他关系型数据库相比,有以下特点

  • H2 数据库是纯 Java 语言编写,使用不受平台限制,且使用时只需要引入相关 jar 包
  • H2 数据库是轻量化的,对于数据存储量较少时,可以与应用程序一起打包发布,无需单独部署
  • H2 数据库提供 web 控制台页面来管理数据库,且支持标准 SQL 语句和 JDBC 连接
  • 为应对不同使用场景,H2 数据库提供了项目内嵌、服务器部署、以及集群部署三种使用模式
  • 1.3 安装

    H2 数据库的安装是十分便捷的,只需要到 H2 官网地址 下载对应系统的安装包进行安装使用即可。

  • Windows installer,windows 下安装版本
  • All Platforms,支持所有平台的解压版本
  • 可以下载支持所有平台的版本压缩包到本地,解压后执行 h2/bin 目录下的 h2.bat 或 h2w.bat 文件,运行后弹出命令窗口并跳转 web 控制台页面管理 H2 数据库。

    H2 数据库 web 控制台管理页面如下图所示

    web 控制台页面中,

  • 可以切换显示语言,
  • 在 JDBC URL对应的值中可以自定义配置 H2 数据库持久化的文件路径信息
  • User Name 中输入数据库连接用户名称
  • Password 中数据连接数据库的密码
  • 需要注意的是,页面中的 Connect 与 Test Connection 功能是略不同的,

  • Test Connection 用来测试数据库连接,需要保证指定路径下已经有对应的数据库文件,且用户名和密码正确
  • Connect 功能在不存在数据库文件时,可以根据指定连接信息初始化数据库文件并自动连接;如果对应数据库文件存在且连接信息正确,则会连接进入数据库。
  • 另外, Preferences 页面中可以对 H2 的基础运行属性进行配置,如

  • Allowed clients,配置允许的客户端连接方式,默认只允许本地客户端连接
  • Connection security,配置 HTTP 或 HTTPS 的连接方式,默认 HTTP
  • Port number,数据库服务端口号,默认 8082
  • 对应的属性配置信息存放在用户文件目录下的 .h2.server.properties 文件中

    1.4 服务模式与连接方式

    H2 数据库提供了三种不同的运行和连接模式,分别是内嵌模式、服务器模式、以及混合模式。

    Embedded Mode 即内嵌模式,该模式下数据库内嵌在项目 JVM 之中,性能较好,同时也支持持久化,但是内嵌模式同一时间仅支持一个客户端进行数据库的连接。

    内嵌模式连接语法为: jdbc:h2:file:[path] ,其中的 path 即数据库文件持久化路径,可以配置绝对路径或相对路径,其中相对路径会存储在系统用户文件目录下。

  • jdbc:h2:file:~/data/db ,windows 系统下会在当前用户目录的 /data 目录下,而 linux 系统中会在 /home/data 目录下
  • jdbc:h2:file:/opt/data/db ,linux 系统下指定绝对路径
  • jdbc:h2:file:E:/H2/db ,windows 系统下指定绝对路径
  • 服务器模式
  • Server Mode,即服务器模式,服务器模式与内嵌模式类似,但是 H2 会作为单独的服务在系统中运行,客户端可以通过 TCP/IP 连接数据库服务,与 MySQL 连接类似。

    H2 数据库的服务器模式连接字符串语法为: jdb c:h2:tcp://<server>[:<port>]/[<path>]<databaseName>

    具体连接字符串如: jdbc:h2:tcp:127.0.0.1/~/data/h2db

    混合模式是指嵌入模式和服务器模式同时使用,来应对不同程序的连接需求,对于主连接程序,可以使用内嵌模式初始化本地 H2 数据库并连接,而创建的 H2 数据库作为服务启动,这样其他的程序也可以通过 TCP/IP 方式连接并进行操作。

    混合模式下 H2 可以支持多客户端连接,使用内嵌模式的程序执行速度更快,其余客户端连接稍慢一些。

    内存模式顾名思义,就是指数据库仅存在于内存中,不会进行持久化,在服务停止或重启后,所有产生的数据都会清除。

    H2 数据库定义内存模式是通过指定 JDBC URL 值实现的,如果不指定对应的持久化文件,而是使用 jdbc:h2:mem:<databaseName> 的方式指定,则数据不会进行持久化操作。

    内存模式使用时要谨慎,使用不可以持久化数据的数据库不是一个很好的选择。

    2. SpringBoot 中使用 H2 数据库

    2.1 引入依赖

    在项目中使用 H2 数据库时,通过 Maven 维护依赖信息

    <!--h2数据库-->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
        <scope>runtime</scope>
    </dependency>
    
  • 对于 H2 jar 包的其他版本,可以在 Maven 仓库 h2 中查询使用。
  • 2.2 H2 配置

    引入 H2 依赖包后,可以在 SpringBoot 配置文件中定义 H2 数据库相关配置信息

    spring:
      datasource:
        # 数据库驱动
        driver-class-name: org.h2.Driver
        # JDBC URL
        url: jdbc:h2:file:~/data/db
        # 数据库用户名和密码
        username: root
        password: 123456
        # 项目启动时初始化数据库表结构
        schema: classpath:db/schema-h2.sql
        # 插入数据库数据
        data: classpath:db/data-h2.sql
        console:
          # web 控制台页面,当前服务地址 + /h2-console
          path: /h2-console
          # 是否开启 H2 服务
          enabled: true
    

    2.3 操作数据库

    配置完成后,在项目中使用 H2 数据库与 MySQL 等其他数据库并无差别,同样是需要与 MyBatis 等框架结合使用来操作数据。

    2.4 MySQL 语句转 H2

    如果在初始化 H2 数据库时使用从 MySQL 中导出的 SQL 语句,那么在执行 SQL 语句时会报错而不能正常进行。

    这是因为 H2 数据库仅支持标准的 SQL 内容,对于 MySQL 中的 ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 等配置是不支持的,因此在执行时可以将这些语法内容删除。

    3. 注意事项

    3.1 H2 版本不一致问题

    问题描述:org.h2.mvstore.MVStoreException: The write format 1 is smaller than the supported format 2,即 H2 数据库文件写入版本为 1.x ,不支持 2.x 版本读取。

    原因:当 H2 对应数据库文件生成时版本与连接时版本不一致时,可能会出现上述问题,尤其是两个大版本之间不一致时。

    解决方法:可以将连接文件时的版本回退至匹配的版本,或者通过高版本重新初始化数据库文件。

    分类:
    后端
    标签: