H2数据库应用

概述

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

使用说明

安装

maven中添加依赖

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

运行方式

  1. 在内存中运行

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

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

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

  2. 嵌入式

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

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

  3. 服务模式

    H2支持三种服务模式:

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

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

    jdbc:h2:tcp://localhost/~/test 使用用户主目录
    jdbc:h2:tcp://localhost//data/test 使用绝对路径
    
  4. 连接字符串参数

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

    启动服务,在命令行中执行

    java -cp h2*.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模式启动
  6. 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

SELECT

INSERT

INSERT

UPDATE

UPDATE

DELETE

DELETE

BACKUP

BACKUP

EXPLAIN

EXPLAIN

7、MERGE


RUNSCRIPT

运行sql脚本文件

RUNSCRIPT

SCRIPT

根据数据库创建sql脚本

SCRIPT

SHOW

SHOW

ALTER

ALTER INDEX RENAME

ALTER INDEX RENAME

ALTER SCHEMA RENAME

ALTER SCHEMA RENAME

ALTER SEQUENCE

ALTER SEQUENCE

ALTER TABLE

ALTER TABLE

增加约束

增加约束

修改列

修改列

删除列

删除列

删除序列

删除序列

ALTER USER

修改用户名

修改用户名

修改用户密码

修改用户密码

ALTER VIEW

ALTER VIEW

COMMENT

COMMENT

CREATE CONSTANT

CREATE CONSTANT

CREATE INDEX

CREATE INDEX

CREATE ROLE

CREATE ROLE

CREATE SCHEMA

CREATE SCHEMA

CREATE SEQUENCE

CREATE SEQUENCE

CREATE TABLE

CREATE TABLE

CREATE TRIGGER

CREATE TRIGGER

CREATE USER

CREATE USER

CREATE VIEW

CREATE VIEW

DROP

DROP

GRANT RIGHT

给schema授权授权

授权

给schema授权给schema授权

给schema授权

复制角色的权限

复制角色的权限

REVOKE RIGHT

移除授权

移除授权

移除角色具有的权限

移除角色具有的权限

ROLLBACK

从某个还原点(savepoint)回滚

回滚事务

创建savepoint

数据类型

数据类型

INT Type

INT Type

集群

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

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

  1. 创建目录

    创建两个服务器工作的目录

  1. 启动tcp服务

    执行如下命令分别在9101、9102端口启动两个使用tcp服务模式的数据库

  1. 使用CreateCluster工具创建集群

    如果两个数据库不存在,该命令将会自动创建数据库。如果一个数据库失效,可以先删除坏的数据库文件,重新启动数据库,然后重新运行CreateCluster工具

  1. 连接数据库
    现在可以使用如下连接字符串连接集群数据库

  2. 监控集群运行状态
    可以使用如下命令查看配置的集群服务器是否都在运行

  3. 限制
    H2的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果

    执行如下操作时请小心:

    • 自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建不支持SET AUTOCOMMIT FALSE语句;

    • 如果需要设置成为不自动提交,可以执行方法Connection.setAutoCommit(false)

参考资料

h2database官网

http://www.importnew.com/17924.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容