# H2 应用指南

# 概述

H2 是一个开源的嵌入式数据库引擎,采用 java 语言编写,不受平台的限制。同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

# 使用说明

# H2 控制台应用

H2 允许用户通过浏览器接口方式访问 SQL 数据库。

  1. 进入官方下载地址 (opens new window),选择合适版本,下载并安装到本地。
  2. 启动方式:在 bin 目录下,双击 jar 包;执行 java -jar h2*.jar;执行脚本:h2.bath2.sh
  3. 在浏览器中访问:http://localhost:8082,应该可以看到下图中的页面:

img

点击 Connect ,可以进入操作界面:

img

操作界面十分简单,不一一细说。

# 嵌入式应用

# JDBC API

Connection conn = DriverManager.
    getConnection("jdbc:h2:~/test");
conn.close();

详见:Using the JDBC API (opens new window)

# 连接池

import org.h2.jdbcx.JdbcConnectionPool;
JdbcConnectionPool cp = JdbcConnectionPool.
create("jdbc:h2:~/test", "sa", "sa");
Connection conn = cp.getConnection();
conn.close(); cp.dispose();

详见:Connection Pool (opens new window)

# Maven

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
</dependency>

详见:Maven 2 (opens new window)

# Hibernate

hibernate.cfg.xml (or use the HSQLDialect):

<property name="dialect">
    org.hibernate.dialect.H2Dialect
</property>

详见:Hibernate (opens new window)

Datasource class: org.h2.jdbcx.JdbcDataSource oracle.toplink.essentials.platform.database.H2Platform

详见:TopLink and Glassfish (opens new window)

# 运行方式

# 嵌入式

数据库持久化存储为单个文件。

连接字符串:\~/.h2/DBName 表示数据库文件的存储位置,如果第一次连接则会自动创建数据库。

  • jdbc:h2:\~/test - 'test' 在用户根目录下
  • jdbc:h2:/data/test - 'test' 在 /data 目录下
  • jdbc:h2:test - 'test' 在当前工作目录

# 内存式

数据库只在内存中运行,关闭连接后数据库将被清空,适合测试环境

连接字符串:jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1

如果不指定 DBName,则以私有方式启动,只允许一个连接。

  • jdbc:h2:mem:test - 一个进程中有多个连接
  • jdbc:h2:mem: - 未命名的私有库,一个连接

# 服务模式

H2 支持三种服务模式:

  • web server:此种运行方式支持使用浏览器访问 H2 Console
  • TCP server:支持客户端/服务器端的连接方式
  • PG server:支持 PostgreSQL 客户端

启动 tcp 服务连接字符串示例:

  • jdbc:h2:tcp://localhost/\~/test - 用户根目录
  • jdbc:h2:tcp://localhost//data/test - 绝对路径

# 启动服务

执行 java -cp *.jar org.h2.tools.Server

执行如下命令,获取选项列表及默认值

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

常见的选项如下:

  • -web:启动支持 H2 Console 的服务
  • -webPort <port>:服务启动端口,默认为 8082
  • -browser:启动 H2 Console web 管理页面
  • -tcp:使用 TCP server 模式启动
  • -pg:使用 PG server 模式启动

# 设置

  • jdbc:h2:..;MODE=MySQL 兼容模式(或 HSQLDB 等)
  • jdbc:h2:..;TRACE_LEVEL_FILE=3 记录到 *.trace.db

# 连接字符串参数

  • DB_CLOSE_DELAY - 要求最后一个正在连接的连接断开后,不要关闭数据库
  • MODE=MySQL - 兼容模式,H2 兼容多种数据库,该值可以为:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL
  • AUTO_RECONNECT=TRUE - 连接丢失后自动重新连接
  • AUTO_SERVER=TRUE - 启动自动混合模式,允许开启多个连接,该参数不支持在内存中运行模式
  • TRACE_LEVEL_SYSTEM_OUTTRACE_LEVEL_FILE - 输出跟踪日志到控制台或文件, 取值 0 为 OFF,1 为 ERROR(默认值),2 为 INFO,3 为 DEBUG
  • SET TRACE_MAX_FILE_SIZE mb - 设置跟踪日志文件的大小,默认为 16M

# maven 方式

此外,使用 maven 也可以启动 H2 服务。添加以下插件

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>org.h2.tools.Server</mainClass>
    <arguments>
      <argument>-web</argument>
      <argument>-webPort</argument>
      <argument>8090</argument>
      <argument>-browser</argument>
    </arguments>
  </configuration>
</plugin>

在命令行中执行如下命令启动 H2 Console

mvn exec:java

或者建立一个 bat 文件

@echo off
call mvn exec:java
pause

此操作相当于执行了如下命令:

java -jar h2-1.3.168.jar -web -webPort 8090 -browser

# Spring 整合 H2

(1)添加依赖

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.194</version>
</dependency>

(2)spring 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/jdbc
            http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

  <!--配置数据源-->
  <bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool"
        destroy-method="dispose">
    <constructor-arg>
      <bean class="org.h2.jdbcx.JdbcDataSource">
        <!-- 内存模式 -->
        <property name="URL" value="jdbc:h2:mem:test"/>
        <!-- 文件模式 -->
        <!-- <property name="URL" value="jdbc:h2:testRestDB" /> -->
        <property name="user" value="root"/>
        <property name="password" value="root"/>
      </bean>
    </constructor-arg>
  </bean>

  <!-- JDBC模板 -->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
  </bean>
  <bean id="myJdbcTemplate" class="org.zp.notes.spring.jdbc.MyJdbcTemplate">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
  </bean>

  <!-- 初始化数据表结构 -->
  <jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
    <jdbc:script location="classpath:sql/h2/create_table_student.sql"/>
  </jdbc:initialize-database>
</beans>

# H2 SQL

# SELECT

img

# INSERT

img

# UPDATE

img

# DELETE

img

# BACKUP

img

# EXPLAIN

img

7、MERGE img

# RUNSCRIPT

运行 sql 脚本文件

img

# SCRIPT

根据数据库创建 sql 脚本

img

# SHOW

img

# ALTER

# ALTER INDEX RENAME

img

# ALTER SCHEMA RENAME

img

# ALTER SEQUENCE

img

# ALTER TABLE

img

# 增加约束

img

# 修改列

img

# 删除列

img

# 删除序列

img

# ALTER USER

# 修改用户名

img

# 修改用户密码

img

# ALTER VIEW

img

# COMMENT

img

# CREATE CONSTANT

img

# CREATE INDEX

img

# CREATE ROLE

img

# CREATE SCHEMA

img

# CREATE SEQUENCE

img

# CREATE TABLE

img

# CREATE TRIGGER

img

# CREATE USER

img

# CREATE VIEW

img

# DROP

img

# GRANT RIGHT

给 schema 授权授权

img

给 schema 授权给 schema 授权

img

# 复制角色的权限

img

# REVOKE RIGHT

# 移除授权

img

# 移除角色具有的权限

img

# ROLLBACK

# 从某个还原点(savepoint)回滚

img

# 回滚事务

img

# 创建 savepoint

img

# 数据类型

img

# INT Type

img

# 集群

H2 支持两台服务器运行两个数据库成为集群,两个数据库互为备份,如果一个服务器失效,另一个服务器仍然可以工作。另外只有服务模式支持集群配置。

H2 可以通过 CreateCluster 工具创建集群,示例步骤如下(在在一台服务器上模拟两个数据库组成集群):

  • 创建目录
    • 创建两个服务器工作的目录
  • 启动 tcp 服务
    • 执行如下命令分别在 9101、9102 端口启动两个使用 tcp 服务模式的数据库
  • 使用 CreateCluster 工具创建集群
    • 如果两个数据库不存在,该命令将会自动创建数据库。如果一个数据库失效,可以先删除坏的数据库文件,重新启动数据库,然后重新运行 CreateCluster 工具
  • 连接数据库现在可以使用如下连接字符串连接集群数据库
    • 监控集群运行状态
    • 可以使用如下命令查看配置的集群服务器是否都在运行
  • 限制
    • H2 的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果
  • 执行如下操作时请小心:
    • 自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建不支持 SET AUTOCOMMIT FALSE 语句;
    • 如果需要设置成为不自动提交,可以执行方法 Connection.setAutoCommit(false)

# 参考资料

# 🚪 传送门

| 我的 Github 博客 (opens new window) | db-tutorial 首页 (opens new window) |