文章目录

    • H2介绍
    • H2用途
    • H2运行模式
      • 1、嵌入式模式
      • 2、服务器模式
      • 3、混合模式
    • 连接字符串参数
    • 数据库URL连接方式
    • H2简单使用
    • H2使用JDBC连接

H2介绍

H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。

H2还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便。

官网地址:http://www.h2database/

H2是Java SQL数据库。H2的主要特点是:

  • 非常快,开源,JDBC API
  • 嵌入式和服务器模式; 内存数据库
  • 基于浏览器的Console应用
  • 占地面积小:大约2 MB的jar文件大小
特征H2DerbyHSQLDBMySQLPostgreSQL
纯 JavaYesYesYesNoNo
内存模式YesYesYesNoNo
数据库加密YesYesYesNoNo
ODBC 驱动YesNoNoYesYes
全文搜索YesNoNoYesYes
多版本并发YesNoYesYesYes
Footprint (embedded)~2 MB~3 MB~1.5 MB
Footprint (client)~500 KB~600 KB~1.5 MB~1 MB~700 KB

H2用途

H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。

它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。

H2的第三个用处是作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。不过这样系统架构就会比较复杂了。

H2运行模式

H2支持三种不同的运行模式,以适用于更多不同的应用场景。

1、嵌入式模式

嵌入式模式下,H2与应用运行于同一个JVM中,H2被应用启动。该模式也是性能最好的模式,也是官方推荐的模式。

缺点是数据库只能随时在一个虚拟机(和类加载器)中打开。与所有模式一样,持久性数据库和内存数据库均受支持。并发打开的数据库数或打开的连接数没有限制。

在嵌入式模式下,I / O操作可以由执行SQL命令的应用程序线程执行。该应用程序可能不会中断这些线程,它可能导致数据库损坏,因为JVM在线程中断期间会关闭I / O句柄。考虑其他方法来控制应用程序的执行。当可能发生中断时,可以将async: 文件系统用作解决方法,但不能保证完全安全。建议改用 客户端-服务器 模型,客户端可能会中断自己的线程。

嵌入式模式:使用JDBC的本地连接

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

连接字符串:

jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE

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

2、服务器模式

服务器模式,也被称为 远程模式客户端/服务器 模式,应用程序使用 JDBCODBC API 远程(TCP/IP传输)访问数据库。类似于传统数据库mysql、oracle。

实际上,H2 Server本身也是使用嵌入式模式来启动运行H2 Database的。由于服务器模式是通过远程(TCP/IP传输)连接访问数据,其性能要低于嵌入式模式。

每个服务器并发打开的数据库数或打开的连接数没有限制。

服务器模式:通过 JDBC 或 ODBC 通过 TCP/IP 进行远程连接

H2支持三种服务模式:

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

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

jdbc:h2:tcp://localhost/~/test 使用用户主目录

jdbc:h2:tcp://localhost//data/test 使用绝对路径

3、混合模式

该模式是嵌入式模式与混合模式的融合。一个应用启动嵌入式模式的H2 Database,其他应用可以将其作为服务器模式来远程访问。

混合模式:同时进行本地和远程连接

连接字符串参数

  • DB_CLOSE_DELAY :要求最后一个正在连接的连接断开后,不要关闭数据库

  • MODE=MySQL:兼容模式,H2兼容多种数据库,该值可以为:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL

  • AUTO_SERVER=TRUE:启动自动混合模式,允许开启多个连接,该参数不支持在内存中运行模式

  • AUTO_RECONNECT=TRUE:连接丢失后自动重新连接

  • TRACE_LEVEL_SYSTEM_OUTTRACE_LEVEL_FILE:输出跟踪日志到控制台或文件, 取值0为OFF,1为ERROR(默认值),2为INFO,3为DEBUG

  • SET TRACE_MAX_FILE_SIZE mb:设置跟踪日志文件的大小,默认为16M

数据库URL连接方式

话题URL格式和示例
嵌入式(本地)连接jdbc:h2:[file:][<path>]<databaseName>
jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:file:C:/data/sample (Windows only)
内存中(私有)jdbc:h2:mem:
内存中(命名)jdbc:h2:mem:<databaseName>
jdbc:h2:mem:test_mem
使用TCP / IP的服务器模式
(远程连接)
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://dbserv:8084/~/sample
jdbc:h2:tcp://localhost/mem:test
使用TLS的服务器模式
(远程连接)
jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:ssl://localhost:8085/~/sample;
使用加密文件jdbc:h2:<url>;CIPHER=AES
jdbc:h2:ssl://localhost/~/test;CIPHER=AES
jdbc:h2:file:~/secure;CIPHER=AES
文件锁定方法jdbc:h2:<url>;FILE_LOCK={FILE\|SOCKET\|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET
仅在已存在的情况下打开jdbc:h2:<url>;IFEXISTS=TRUE
jdbc:h2:file:~/sample;IFEXISTS=TRUE
VM退出时不要关闭数据库jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE
在连接上执行SQLjdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql'
jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM ‘~/create.sql’;RUNSCRIPT FROM ‘~/populate.sql’
用户名和/或密码jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123
调试跟踪设置jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3>
jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3
忽略未知设置jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE
自定义文件访问模式jdbc:h2:<url>;ACCESS_MODE_DATA=rws
zip文件中的数据库jdbc:h2:zip:<zipFileName>!/<databaseName>
jdbc:h2:zip:~/db.zip!/test
兼容模式jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
自动重新连接jdbc:h2:<url>;AUTO_RECONNECT=TRUE
jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
自动混合模式jdbc:h2:<url>;AUTO_SERVER=TRUE
jdbc:h2:~/test;AUTO_SERVER=TRUE
页面大小jdbc:h2:<url>;PAGE_SIZE=512
更改其他设置jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3

H2简单使用

1、H2数据库下载,打开官网(http://www.h2database)下载

2、解压下载包,即可使用,解压后目录如下

h2
|---bin
|  |---h2-1.1.116.jar  //H2数据库的jar包(驱动也在里面)
|  |---h2.bat          //Windows控制台启动脚本
|  |---h2.sh           //Linux控制台启动脚本
|  |---h2w.bat        //Windows控制台启动脚本(不带黑屏窗口)
|---docs             //H2数据库的帮助文档(内有H2数据库的使用手册)
|---service         //通过wrapper包装成服务。
|---src             //H2数据库的源代码
|---build.bat       //windows构建脚本
|---build.sh         //linux构建脚本

3、windows环境下运行 h2.bat,linux环境下运行 h2.sh,打开控制台

默认情况下H2数据库的TCP服务端口为9092,客户端的端口为8082,PG服务的端口为5435。

4、windows环境下,运行文件后自动打开浏览器,地址:http://本地ip:8082

5、选择中文语言,并点击连接,自动创建test数据库,数据库文件在~ 目录中,~ 代表 用户自己目录

6、复制测试脚本sql,并执行

7、运行结果如下:

H2使用JDBC连接

1、运行

2、新建maven项目,引入jar包

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

3、编辑JDBC测试类

package com.test.hsqldb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        // 加载H2 DB的JDBC驱动
        Class.forName("org.h2.Driver");

        // 链接数据库,自动在~创建数据库test,得到联接对象 connection
        String url = "jdbc:h2:~/test";
        Connection con = DriverManager.getConnection(url, "sa", "");

        // 新建数据表
        String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
        Statement createStatement = con.createStatement();
        long f1 = createStatement.executeUpdate(ctreateTable);
        System.out.println("创建表:" + f1);

        // 插入数据
        String insertSql = "INSERT INTO test VALUES(1,'小明')";
        Statement insertStatement = con.createStatement();
        long f2 = insertStatement.executeUpdate(insertSql);
        System.out.println("插入数据:" + f2);

        // 查询数据
        String selectSql = "select id,name from test";
        PreparedStatement prepareStatement = con.prepareStatement(selectSql);
        // 发送SQL 返回一个ResultSet
        ResultSet rs = prepareStatement.executeQuery();

        // 编历结果集
        while (rs.next())// 从数据库的取一行数据,是否还有下一行
        {
            int id = rs.getInt(1); // 从1开始
            String name = rs.getString(2);
            System.out.println("id:" + id + "\t名称:" + name);
        }

        // 关闭连接
        con.close();
    }
}

4、运行测试类,结果如下:

更多推荐

H2数据库入门