`
kanpiaoxue
  • 浏览: 1789286 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

H2数据库攻略

 
阅读更多

 

 

引用地址: https://www.cnblogs.com/gao241/p/3480472.html

 

 

 

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="src/main/resources/sql/h2/schema.sql"/>
                                <transaction src="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 id="dataSource" 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

2INSERT

3UPDATE

4DELETE

5BACKUP

6EXPLAIN

7MERGE

8RUNSCRIPT

运行sql脚本文件

9SCRIPT

根据数据库创建sql脚本

10SHOW

11ALTER INDEX RENAME

12ALTER SCHEMA RENAME

13ALTER SEQUENCE

14ALTER TABLE

增加列

增加约束

修改列

删除列

删除序列

15ALTER USER

修改用户名

修改用户密码

16ALTER VIEW

17COMMENT

18CREATE CONSTANT

19CREATE INDEX

20CREATE ROLE

21CREATE SCHEMA

22CREATE SEQUENCE

23CREATE TABLE

24CREATE TRIGGER

25CREATE USER

26CREATE VIEW

27DROP

28GRANT RIGHT授权

schema授权

复制角色的权限

29REVOKE RIGHT移除授权

移除角色具有的权限

30ROLLBACK

从某个还原点(savepoint)回滚

回滚事务

创建savepoint

 

 

五、数据类型

H2支持如下数据类型

1INT Type

 

值范围:-2147483648 - 2147483647

2、BOOLEAN Type

可选值:TRUE和FALSE

3、TINYINT Type

值范围:-128 -127

4、SMALLINT Type

值范围: -32768 to 32767

5、BIGINT Type

值范围:-9223372036854775808 - 9223372036854775807

6、IDENTITY Type

自动增长值

值范围:-9223372036854775808 - 9223372036854775807

7、DECIMAL Type

示例:DECIMAL(20, 2)

8、DOUBLE Type

9、REAL Type

浮点类型

10、TIME Type

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

11 、DATE Type

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

12、TIMESTAMP Type

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

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

13、BINARY Type

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

示例:BINARY(1000)

14、OTHER Type

用于存储序列化的java对象

15、VARCHAR Type

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

示例:VARCHAR(255)

16、VARCHAR_IGNORECASE Type

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

17、CHAR Type

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

18、BLOB Type

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

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

19、CLOB Type

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

映射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)

分享到:
评论

相关推荐

    h2数据库 jar包 下载 资料

    标题中的“h2数据库 jar包 下载 资料”指的是可以获取到H2数据库的JAR包以及相关的学习资料,这对于开发者来说是非常有价值的资源。 首先,我们来详细了解一下H2数据库的核心特性: 1. **轻量级**: H2数据库是一个...

    H2数据库客户端

    **H2数据库客户端详解** H2数据库是一款轻量级、高性能的开源关系型数据库系统,设计用于嵌入式和服务器模式的应用。它以其简洁的API、高速度和灵活性而受到开发者的欢迎。H2数据库支持SQL标准,可以方便地与Java...

    h2数据库批量导出

    《H2数据库批量导出详解》 H2数据库是一款开源、高性能、轻量级的Java关系型数据库,广泛应用于测试、开发以及嵌入式环境。它支持多种数据库模式,包括MySQL、Oracle等,并且提供了丰富的命令行工具和API,使得...

    H2数据库官方文档(English)

    根据提供的文件内容,以下是关于H2数据库的知识点: H2数据库是一种开源的关系型数据库管理系统(RDBMS),它以嵌入式数据库的形式出现,通常被用作内存数据库。这意味着它可以将数据库存储在计算机的主内存中,从而...

    springboot整合h2数据库实战

    Spring Boot 整合 H2数据库实战 Spring Boot 是一个基于 Java 的开源框架,旨在简化 Java 企业级应用程序的开发过程。H2 是一个开源的关系型数据库,采用 Java 语言编写,不受平台的限制。Spring Boot 整合 H2 ...

    H2数据库驱动包

    H2数据库驱动包是专为H2数据库设计的连接组件,它使得开发者能够轻松地在应用程序中集成H2数据库,以便进行数据存储、查询和管理。H2数据库是一款开源、轻量级、高性能的关系型数据库,广泛应用于开发测试和小型项目...

    h2数据导入mysql数据库(看评论酌情下载)

    h2 数据库导入 MySQL 数据库 h2 数据库导入 MySQL 数据库是指将 h2 数据库中的数据导入到 MySQL 数据库中,以便更好地存储和管理数据。下面将详细介绍 h2 数据库导入 MySQL 数据库的步骤。 首先,需要创建一个 ...

    H2 Database(H2内存数据库)

    H2就不做很多介绍了。资源包内容列表是我进行H2预研是收集的H2资料,应该是最全面的的了: 1、h2.pdf (H2 API) 2、h2-1.3.173.jar (截止2013-8-15最新的H2.jar) 3、h2-2013-07-28.zip (截止...13、H2数据库使用.doc

    h2view.zip h2数据库可视化工具,个人开发,bug有点多,请见谅

    《H2View:一款个人开发的H2数据库可视化工具》 H2View是一款专为H2数据库设计的可视化工具,由个人开发者独立制作。虽然在使用过程中可能存在一些已知的bug,但其核心功能旨在帮助用户更直观地管理和操作H2数据库...

    H2数据库最新稳定版本,平台无关包

    H2数据库是一款开源、轻量级、高性能的关系型数据库,特别适合于嵌入式系统和小型项目。它的名称“H2”来源于它是一个二维(2D)数据存储解决方案。这款数据库管理系统是用Java编写,因此具有平台无关性,可以在任何...

    h2 数据库驱动包

    h2 数据库驱动包, 为drools-server 提供数据库支持,放在tomcat lib目录下执行

    h2数据库安装文件-2021610.zip

    H2数据库是一款开源、轻量级、嵌入式的Java数据库,广泛应用于开发测试和小型项目中。它支持多种数据类型,包括INT、VARCHAR、DATE、TIME等,并且提供了SQL92标准的大部分功能,便于开发者进行数据库操作。下面将...

    h2 数据库 客户端

    **H2数据库客户端详解** H2数据库是一款开源、高性能、轻量级的Java关系型数据库管理系统,它在嵌入式和服务器模式下均表现出色。H2数据库以其易用性、快速性能和全面的SQL支持而受到开发者的青睐,尤其在进行测试...

    启动H2数据库并导入数据库脚本

    标题中的“启动H2数据库并导入数据库脚本”是指在计算机环境中启动H2数据库服务器,并将预先准备的SQL脚本(如`schema.sql`)导入到该数据库中以创建或更新数据库结构的过程。H2是一个轻量级、开源的Java数据库,常...

    H2 Database 教程

    H2数据库适合嵌入到Java应用程序中,不需要额外的安装步骤,便于测试和开发。 1. H2数据库特点 H2数据库具有以下特点:支持多种Java虚拟机,包括服务器和客户端版本;支持广泛的SQL语句;提供了一个Web控制台,方便...

    H2数据库创建和使用教程 新手入门

    ### H2数据库创建和使用教程知识点详解 #### H2数据库简介 H2是一款轻量级、高性能的开源关系型数据库管理系统,它完全基于Java开发,这意味着H2可以在任何支持Java虚拟机(JVM)的平台上运行。H2因其体积小、易用性...

    H2数据库完整版-安装服务和说明

    H2数据库是一款开源、轻量级、嵌入式的Java关系型数据库系统,广泛应用于开发测试、小型项目以及作为大型应用程序的内存模式。本资源提供的是H2数据库的完整版,包含安装服务和详细说明,旨在帮助用户快速上手并深入...

    h2数据库及h2数据库驱动

    H2数据库是一个轻量级、高性能的开源关系型数据库,完全用Java编写,这使得它具有高度的可移植性,可以在任何支持Java的环境中运行。H2提供了多种运行模式,包括内嵌模式(Embedded Mode)、服务器模式(Server Mode...

    H2数据库中文资料

    **H2数据库中文资料** H2数据库是一款轻量级、高性能、开源的关系型数据库系统,广泛应用于测试环境和小型项目中。它支持多种数据库模式,包括单用户模式、嵌入式模式、服务器模式等,使得在不同的场景下都能灵活...

Global site tag (gtag.js) - Google Analytics