H2数据库攻略

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

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

一、引入Maven依赖

maven中定义H2数据库的版本属性

    <properties>
        <h2.version>1.3.172</h2.version>
    </properties>

添加H2依赖

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>${h2.version}</version>
        <scope>test</scope>
    </dependency>

二、运行方式

1、在内存中运行

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

连接字符串:

jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1

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

2、嵌入式

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

连接字符串:

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

~/.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模式启动

此外,使用maven也可以启动H2服务

复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>1.0.0</modelVersion>
        <version>1.0.0</version>
        <groupId>groupid</groupId>
        <artifactId>h2-console</artifactId>
        <name>H2 Console</name>
        <packaging>pom</packaging>
        <properties>
            <h2.version>1.3.172</h2.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>${h2.version}</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <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>
            </plugins>
        </build>
    </project>
复制代码

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

mvn exec:java

或者建立一个bat文件

@echo off
call mvn exec:java
pause

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

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

三、应用程序配置

1Properties配置

java应用程序关于数据库的Properties配置文件示例如下:

复制代码
#h2 database settings
jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1
jdbc.username=sa
jdbc.password=
#connection pool settings
jdbc.pool.maxIdle=5
jdbc.pool.maxActive=40
复制代码

2、初始化数据库

1)、在Maven中初始化数据库

可以创建一个Profile,专门用于初始化数据库。在maven中可以通过maven-antrun-plugin执行ant任务,在ant任务中使用sql标签可以执行sql脚本文件,配置示例如下:

复制代码
    <profile>
        <id>refresh-db</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <configuration>
                        <target>
                            <property file="src/main/resources/application.properties" />
                            <sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue" encoding="${project.build.sourceEncoding}">
                                <classpath refid="maven.test.classpath" />
                                <transaction src="http://t.zoukankan.com/src/main/resources/sql/h2/schema.sql"/>
                                <transaction src="http://t.zoukankan.com/src/test/resources/data/h2/import-data.sql"/>
                            </sql>
                        </target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
复制代码

执行如下命令调用该Profile,初始化数据库

mvn antrun:run -Prefresh-db

2)、在Spring中初始化数据库

Spring Profilemaven profile一样,也可以模拟不同的开发环境。在Spirng中可以通过jdbc:initialize-database初始化数据库,配置示例如下

复制代码
    <beans profile="test">
        <context:property-placeholder ignore-resource-not-found="true"
            location="classpath*:/application.properties,
                      classpath*:/application.test.properties" />    
        <!-- Spring Simple连接池 -->
        <bean   class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </bean>
        <!-- 初始化数据表结构 -->
        <jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
            <jdbc:script location="classpath:sql/h2/schema.sql" />
            <jdbc:script location="classpath:data/h2/import-data.sql" encoding="UTF-8"/>
        </jdbc:initialize-database>
    </beans>
复制代码

四、sql语法图

1SELECT

H2数据库攻略第9张

2INSERT

H2数据库攻略第10张

3UPDATE

H2数据库攻略第11张

4DELETE

H2数据库攻略第12张

5BACKUP

H2数据库攻略第13张

6EXPLAIN

H2数据库攻略第14张

7MERGE

H2数据库攻略第15张

8RUNSCRIPT

运行sql脚本文件

H2数据库攻略第16张

9SCRIPT

根据数据库创建sql脚本

H2数据库攻略第17张

10SHOW

H2数据库攻略第18张

11ALTER INDEX RENAME

H2数据库攻略第19张

12ALTER SCHEMA RENAME

H2数据库攻略第20张

13ALTER SEQUENCE

H2数据库攻略第21张

14ALTER TABLE

增加列

H2数据库攻略第22张

增加约束

H2数据库攻略第23张

修改列

H2数据库攻略第24张

删除列

H2数据库攻略第25张

删除序列

H2数据库攻略第26张

15ALTER USER

修改用户名

H2数据库攻略第27张

修改用户密码

H2数据库攻略第28张

16ALTER VIEW

H2数据库攻略第29张

17COMMENT

H2数据库攻略第30张

18CREATE CONSTANT

H2数据库攻略第31张

19CREATE INDEX

H2数据库攻略第32张

20CREATE ROLE

H2数据库攻略第33张

21CREATE SCHEMA

H2数据库攻略第34张

22CREATE SEQUENCE

H2数据库攻略第35张

23CREATE TABLE

H2数据库攻略第36张

24CREATE TRIGGER

H2数据库攻略第37张

25CREATE USER

H2数据库攻略第38张

26CREATE VIEW

H2数据库攻略第39张

27DROP

H2数据库攻略第40张

28GRANT RIGHT授权

H2数据库攻略第41张

schema授权

H2数据库攻略第42张

复制角色的权限

H2数据库攻略第43张

29REVOKE RIGHT移除授权

H2数据库攻略第44张

移除角色具有的权限

H2数据库攻略第45张

30ROLLBACK

从某个还原点(savepoint)回滚

H2数据库攻略第46张

回滚事务

H2数据库攻略第47张

创建savepoint

H2数据库攻略第48张

五、数据类型

H2支持如下数据类型

H2数据库攻略第49张

1INT Type

H2数据库攻略第50张

值范围:-2147483648-2147483647

2、BOOLEAN Type

H2数据库攻略第51张

可选值:TRUE和FALSE

3、TINYINT Type

值范围:-128-127

4、SMALLINT Type

H2数据库攻略第52张

值范围: -32768 to 32767

5、BIGINT Type

H2数据库攻略第53张

值范围:-9223372036854775808-9223372036854775807

6、IDENTITY Type

自动增长值

值范围:-9223372036854775808-9223372036854775807

7、DECIMAL Type

H2数据库攻略第54张

示例:DECIMAL(20, 2)

8、DOUBLE Type

H2数据库攻略第55张

9、REAL Type

浮点类型

10、TIME Type

时间类型,格式为:hh:mm:ss

11、DATE Type

日期类型,格式为:yyyy-MM-dd

12、TIMESTAMP Type

H2数据库攻略第56张

时间戳类型,格式为:yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]

可映射为java对象:java.sql.Timestamp/java.util.Date

13、BINARY Type

H2数据库攻略第57张

存储字节流,大数据建议使用BLOB类型存储

示例:BINARY(1000)

14、OTHER Type

用于存储序列化的java对象

15、VARCHAR Type

H2数据库攻略第58张

存储字符串,大文本数据建议使用CLOB类型存储

示例:VARCHAR(255)

16、VARCHAR_IGNORECASE Type

VARCHAR类似,但是不区分大小写

17、CHAR Type

H2数据库攻略第59张

存储unicode字符串,与VARCHAR的区别是,尾部的空格不会被存储

18、BLOB Type

H2数据库攻略第60张

存储大容量二进制流,最大存储2G数据

映射java对象类型为:java.sql.Blob/java.io.InputStream

19、CLOB Type

H2数据库攻略第61张

用于存储大容量的文本数据

映射java对象类型为:java.sql.Clob/java.io.Reader

20、UUID Type

存储通用唯一识别码,占用128bit

21、ARRAY Type

数组类型,使用一个值列表(1,2)PreparedStatement.setObject(.., new Object[] {..})存储值

映射java对象类型为:java.lang.Object[]

22、GEOMETRY Type

存储空间几何对象,一般存储WKT格式的空间数据

六、集群

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

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

1、创建目录

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

# mkdir server1
# mkdir server2

2、启动tcp服务

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

java org.h2.tools.Server-tcp -tcpPort 9101-baseDir server1
java org.h2.tools.Server-tcp -tcpPort 9102 -baseDir server2

3、使用CreateCluster工具创建集群

java org.h2.tools.CreateCluster
    -urlSource jdbc:h2:tcp://localhost:9101/~/test
    -urlTarget jdbc:h2:tcp://localhost:9102/~/test
    -user sa
    -serverList localhost:9101,localhost:9102

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

4、连接数据库

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

jdbc:h2:tcp://localhost:9101,localhost:9102/~/test

5、监控集群运行状态

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

SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'

6、限制

H2的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果,执行如下操作时请小心:

RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()

自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建

不支持SET AUTOCOMMIT FALSE语句,如果需要设置成为不自动提交,可以执行方法Connection.setAutoCommit(false)

from:https://www.cnblogs.com/gao241/p/3480472.html

免责声明:文章转载自《H2数据库攻略》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WPF学习笔记三 依赖属性Nexus3.x帐号权限配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]MS Sql 7105错误

转自:http://hi.baidu.com/ylj798/blog/item/4878077ab64fe7ea2f73b300.html 有的时候发现查询数据库会出现以下类似的提示: [Microsoft][ODBC SQL Server Driver][SQL Server]text、ntext 或 image 节点的页 (1:220),槽 14 不...

Weblogic常见故障常:JDBC Connection Pools【转】

WebLogic Server中数据库连接池是一个经常出问题的地方,总结一下出问题的原因和解决办法。 一、数据库连接泄漏 此类问题一般都是由于开发人员没有正确关闭数据库连接造成的。比如使用完Connection后,没有调用Connection.close()方法。 1、诊断方法 在Console中,找到Connection Pools Tab 和Diagn...

同步集群时间

首先确保集群已经正常使用(搭建集群完毕) 集群时间同步 时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。 第一步 配置小弟同步老大的操作   配置时间同步实操:     1.时间服务器配置(必须 root 用户)       检查 ntp 是否安装       [root@hadoop10...

sqlmap 安装使用

官网 http://sqlmap.org/ 官方用户手册 ttps://github.com/sqlmapproject/sqlmap/wiki 简介 sqlmap是一个开源渗透测试工具,它可以自动执行检测和利用SQL注入漏洞并接管数据库服务器。它具有强大的检测引擎,拥有针对极限渗透测试的众多细分功能,及数据库指纹识别,从数据库获取数据,访问基础文件系统以...

Java下拼接执行动态SQL语句(转)

     在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题:         http://bbs.csdn.net/topics/390876591         http://bbs.csdn.net/topics/390981627         https://www.linkedin.com/g...

kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

一、kafka 简介 今社会各种应用系统诸如商业、社交、搜索、浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要...