📝 Writing docs.

pull/1/head
Zhang Peng 2018-08-22 11:48:57 +08:00
parent ca553e882a
commit ec69dbc775
1 changed files with 210 additions and 155 deletions

View File

@ -1,11 +1,11 @@
---
title: H2 数据库
date: 2015/01/11
date: 2018/08/22
categories:
- database
- database
tags:
- database
- sql
- database
- sql
---
# H2 数据库
@ -15,7 +15,7 @@ tags:
- [概述](#概述)
- [使用说明](#使用说明)
- [Spring 整合 H2](#spring-整合-h2)
- [h2 sql 语法](#h2-sql-语法)
- [H2 SQL](#h2-sql)
- [数据类型](#数据类型)
- [集群](#集群)
- [参考资料](#参考资料)
@ -28,9 +28,195 @@ H2 是一个开源的嵌入式数据库引擎,采用 java 语言编写,不
## 使用说明
### 安装
### H2 控制台应用
maven 中添加依赖
H2 允许用户通过浏览器接口方式访问 SQL 数据库。
1. 进入[官方下载地址](http://www.h2database.com/html/download.html),选择合适版本,下载并安装到本地。
2. 启动方式:在 bin 目录下,双击 jar 包;执行 `java -jar h2*.jar`;执行脚本:`h2.bat` 或 `h2.sh`
3. 在浏览器中访问http://localhost:8082应该可以看到下图中的页面
![h2-console](https://raw.githubusercontent.com/dunwu/Database/master/images/h2/h2-console.png)
点击 **Connect** ,可以进入操作界面:
![h2-console](https://raw.githubusercontent.com/dunwu/Database/master/images/h2/h2-console-02.png)
操作界面十分简单,不一一细说。
### 嵌入式应用
#### JDBC API
```java
Connection conn = DriverManager.
getConnection("jdbc:h2:~/test");
conn.close();
```
> 详见:[Using the JDBC API](http://www.h2database.com/html/tutorial.html#connecting_using_jdbc)
#### 连接池
```java
import org.h2.jdbcx.JdbcConnectionPool;
JdbcConnectionPool cp = JdbcConnectionPool.
create("jdbc:h2:~/test", "sa", "sa");
Connection conn = cp.getConnection();
conn.close(); cp.dispose();
```
> 详见:[Connection Pool](http://www.h2database.com/html/tutorial.html#connection_pool)
#### Maven
```xml
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
```
> 详见:[Maven 2](http://www.h2database.com/html/build.html#maven2)
#### Hibernate
hibernate.cfg.xml (or use the HSQLDialect):
```xml
<property name="dialect">
org.hibernate.dialect.H2Dialect
</property>
```
> 详见:[Hibernate](http://www.h2database.com/html/tutorial.html#using_hibernate)
#### TopLink 和 Glassfish
Datasource class: `org.h2.jdbcx.JdbcDataSource`
`oracle.toplink.essentials.platform.database.H2Platform`
> 详见:[TopLink and Glassfish](http://www.h2database.com/html/tutorial.html#using_toplink)
### 运行方式
#### 嵌入式
数据库持久化存储为单个文件。
连接字符串:`~/.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`
执行如下命令,获取选项列表及默认值
```shell
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_OUT`、`TRACE_LEVEL_FILE` - 输出跟踪日志到控制台或文件, 取值 0 为 OFF1 为 ERROR默认值2 为 INFO3 为 DEBUG
- `SET TRACE_MAX_FILE_SIZE mb` - 设置跟踪日志文件的大小,默认为 16M
#### maven 方式
此外,使用 maven 也可以启动 H2 服务。添加以下插件
```xml
<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
```shell
mvn exec:java
```
或者建立一个 bat 文件
```shell
@echo off
call mvn exec:java
pause
```
此操作相当于执行了如下命令:
```shell
java -jar h2-1.3.168.jar -web -webPort 8090 -browser
```
## Spring 整合 H2
1. 添加依赖
```xml
<dependency>
@ -40,127 +226,6 @@ maven 中添加依赖
</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 为 OFF1 为 ERROR默认值2 为 INFO3 为 DEBUG
* SET TRACE_MAX_FILE_SIZE mb设置跟踪日志文件的大小默认为 16M
5. **启动服务模式**,打开 H2 Console web 页面
启动服务,在命令行中执行
```shell
java -cp h2*.jar org.h2.tools.Server
```
执行如下命令,获取选项列表及默认值
```shell
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 服务。添加以下插件
```xml
<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
```shell
mvn exec:java
```
或者建立一个 bat 文件
```shell
@echo off
call mvn exec:java
pause
```
此操作相当于执行了如下命令:
```shell
java -jar h2-1.3.168.jar -web -webPort 8090 -browser
```
## Spring 整合 H2
1. 添加依赖
```xml
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.194</version>
</dependency>
```
2. spring 配置
```xml
@ -203,7 +268,7 @@ maven 中添加依赖
</beans>
```
## h2 sql 语法
## H2 SQL
### SELECT
@ -392,32 +457,22 @@ H2 支持两台服务器运行两个数据库成为集群,两个数据库互
H2 可以通过 CreateCluster 工具创建集群,示例步骤如下(在在一台服务器上模拟两个数据库组成集群):
1. 创建目录
创建两个服务器工作的目录
2) 启动 tcp 服务
执行如下命令分别在 9101、9102 端口启动两个使用 tcp 服务模式的数据库
3. 使用 CreateCluster 工具创建集群
如果两个数据库不存在,该命令将会自动创建数据库。如果一个数据库失效,可以先删除坏的数据库文件,重新启动数据库,然后重新运行 CreateCluster 工具
4) 连接数据库现在可以使用如下连接字符串连接集群数据库
5) 监控集群**运行状态**
可以使用如下命令查看配置的集群服务器是否都在运行
6) 限制
H2 的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果
执行如下操作时请小心:
* 自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建不支持 SET AUTOCOMMIT FALSE 语句;
* 如果需要设置成为不自动提交,可以执行方法 Connection.setAutoCommit(false)
- 创建目录
- 创建两个服务器工作的目录
- 启动 tcp 服务
- 执行如下命令分别在 9101、9102 端口启动两个使用 tcp 服务模式的数据库
- 使用 CreateCluster 工具创建集群
- 如果两个数据库不存在,该命令将会自动创建数据库。如果一个数据库失效,可以先删除坏的数据库文件,重新启动数据库,然后重新运行 CreateCluster 工具
- 连接数据库现在可以使用如下连接字符串连接集群数据库
- 监控集群**运行状态**
- 可以使用如下命令查看配置的集群服务器是否都在运行
- 限制
- H2 的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果
- 执行如下操作时请小心:
- 自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建不支持 SET AUTOCOMMIT FALSE 语句;
- 如果需要设置成为不自动提交,可以执行方法 Connection.setAutoCommit(false)
## 参考资料
[h2database 官网](http://www.h2database.com/html/main.html)
- [h2database 官网](http://www.h2database.com/html/main.html)
- [Java 嵌入式数据库 H2 学习总结(一)——H2 数据库入门](https://www.cnblogs.com/xdp-gacl/p/4171024.html)