H2 服务器模式

6019268d1cc763d3070bcb7b2286a6c1_1708240232786-2232b905-6983-46ec-8684-96ec7c4d7488_x-oss-process=image%2Fformat%2Cwebp.png

使用服务器模式(有时也称为远程模式或客户端/服务器模式)时,应用程序使用 JDBC 或 ODBC API 远程打开数据库。H2 服务器需要在同一台虚拟机或另一台虚拟机或另一台计算机上启动。通过连接服务器,许多应用程序可以同时连接到同一个数据库。在内部,服务器进程以嵌入式模式打开数据库。

服务器模式比嵌入式模式慢,因为所有数据都是通过 TCP/IP 传输的。与所有模式一样,持久型和内存型数据库均受支持。对每个服务器同时打开的数据库数量或打开的连接数量没有限制。

启动 H2 服务

使用 H2 服务器模式需要先将 H2 运行成一个服务,下面提供了多种方式去将 H2 运行成服务。

命令行方式

可以使用命令行来启动 H2 数据库服务器。例如,在安装了 H2 数据库的环境下,在命令行中输入类似以下的命令:

java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -web -ifNotExists

如下图:

e3882a4e39c96ce7b5858f1709caac22_1726809517616-18bfecef-0bc9-48c0-8869-7388721455bb_x-oss-process=image%2Fformat%2Cwebp.png

H2 在端口 9092 上运行服务,在 8082 端口上运行控制台服务,使用控制台程序可以管理 H2 数据库。

H2 相关启动参数

-tcpAllowOthers

在H2数据库中,-tcpAllowOthers 是一个启动参数。当 H2 数据库以服务器模式启动时,默认情况下,只允许本地连接(即从运行服务器的同一台机器连接)。使用-tcpAllowOthers 参数可以允许来自其他机器(远程连接)的客户端连接到 H2 数据库服务器。这在多机协作开发、测试或者需要远程访问数据库的场景下非常有用。

如果使用命令行启动H2数据库服务器,命令可能如下:

java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -web -ifNotExists

这里,-tcp表示启动TCP服务器,-tcpAllowOthers允许其他机器连接,-web启动Web控制台用于管理和查询数据库(可通过浏览器访问),-ifNotExists表示如果数据库不存在则创建它。

-tcpPort

这个参数用于指定H2数据库服务器在TCP模式下监听的端口号。默认的端口号是9092,但可以通过-tcpPort参数来修改。例如,如果想要将端口号改为8080,可以在启动命令中加入-tcpPort=8080。

示例用法:

java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -tcpPort=8080 -web -ifNotExists
-baseDir

用于指定数据库文件的基础目录。当创建或访问数据库文件时,H2会基于这个目录进行操作。这对于管理数据库文件的存储位置很有用,特别是在需要将数据库文件存储在特定目录下的情况。

示例用法:

java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir=/data/h2db -web -ifNotExists

在这个例子中,H2数据库的文件将存储在/data/h2db目录下。

-trace

当设置-trace参数时,H2数据库服务器会输出详细的跟踪信息,这有助于在调试问题时查看服务器内部的操作,如查询执行过程、连接建立过程等详细的日志信息。

示例用法:

java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -trace -web -ifNotExists

在 Java 程序中启动

也可以在 Java 程序中使用 org.h2.tools.Server 类来启动 H2 数据库服务器。例如:

package com.hxstrive.h2.start;

import org.h2.tools.Server;

import java.sql.SQLException;

/**
 * 使用 Java 启动 H2 服务
 * @author hxstrive.com
 * @since 1.0.0  2024/9/20 13:20
 */
public class StartH2Server {

    public static void main(String[] args) {
        try {
            Server.createTcpServer("-tcp","-web","-ifNotExists").start();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

注意:需要 JDK11+ 版本,因为字节码版本为 55。

安装成 Windows 服务启动

如果采用压缩包形式安装,此时 H2 主目录下面将多一个 servcie 目录,该目录下面有 bat 脚本,这些脚本借助 wrapper.exe 将 H2 安装成 Windwos 服务,目录内容如下:

a2f317a5fa425363a3175d0053951cc0_1726810496185-cf701de1-0d2e-446f-99c7-ae4825ba5406_x-oss-process=image%2Fformat%2Cwebp.png

运行 1_install_serivices.bat 将 H1 安装成服务。如下图:

93d6f7341eaea8f069dba5d9bc60cd2b_1726810706527-c9a21757-dfa1-40d4-b6a5-e703b2d30042_x-oss-process=image%2Fformat%2Cwebp.png

其他 bat 文件说明:

  • 0_run_server_debug.bat  使用调试模式运行,如下图:

a79ae41bc6506e723a3b9f5080c09319_1726811004082-6bfa4aae-eb74-461a-862e-f89b68fd395e_x-oss-process=image%2Fformat%2Cwebp.png

  • 1_install_service.bat  将 H2 安装成服务

  • 2_start_service.bat  启动 H2 服务。

  • 3_start_browser.bat  启动 H2 控制台,即浏览器管理页面。

  • 4_stop_service.bat  暂停服务。

  • 5_uninstall_service.bat  卸载 H2 服务。

什么是 wrapper.exe?

Wrapper 是一个用于将 Java 应用程序包装成 Windows 服务(在 Windows 系统下)或者 Unix 守护进程(在 Unix/Linux 系统下)的工具。

它的主要功能是让 Java 应用程序能够像系统服务或守护进程一样在后台持续运行,并且提供了一系列的管理和监控功能。例如,在 Windows 环境中,普通的 Java 应用程序如果直接在命令行启动,当关闭命令行窗口时可能会停止运行。而通过wrapper.exe将其包装成 Windows 服务后,该 Java 应用程序就可以在系统后台独立运行,不受命令行窗口关闭的影响。

wrapper.exe 的运行依赖于一个配置文件(通常是 wrapper.conf)。这个配置文件包含了各种参数,如要运行的 Java 应用程序的路径、Java 虚拟机(JVM)的启动参数、应用程序的启动类等信息。

启动 wrapper.exe 时,它会读取 wrapper.conf 文件中的配置内容,然后根据这些配置来启动相应的 Java 应用程序。例如,配置文件中可能会指定 Java 应用程序的主类为 com.example.MyApplication,并且设置 JVM 的内存参数为-Xmx512m(最大堆内存为 512MB)等。

适用场景

开发与测试环境共享

在团队开发和测试过程中,可以启动一个 H2 数据库服务器模式的实例,开发人员和测试人员的多个应用程序(如不同的微服务、不同的测试套件等)都可以连接到这个共享的数据库进行开发、测试工作。这样可以确保数据的一致性,便于集中管理数据库的配置和数据状态。

轻量级数据库服务器需求

对于一些小型的项目或者特定的应用场景,如果不想使用复杂的大型数据库管理系统(如 MySQL、Oracle 等),但又需要一个支持多客户端访问的数据库服务器,H2 服务器模式是一个很好的选择。它具有轻量级、易于部署和配置的特点,同时能够满足基本的数据库功能需求。

简单示例

package com.hxstrive.h2.server_database;

import java.sql.*;

/**
 * H2 Server 数据库示例
 * @author hxstrive.com
 * @since 1.0.0  2024/9/20 11:39
 */
public class H2ServerDatabaseExample {

    public static void main(String[] args) {
        try {
            // 连接到H2 Server数据库
            Connection connection = DriverManager.getConnection("jdbc:h2:tcp://localhost:9092/~/test", "sa", "");

            Statement statement = connection.createStatement();
            // 创建一个名为users的表,包含id和name两列
            statement.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255))");

            // 插入一条数据到users表
            statement.execute("INSERT INTO users (id, name) VALUES (1, 'John')");

            // 查询users表中的数据
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("id: " + id + ", name: " + name);
            }

            // 关闭资源
            resultSet.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

运行示例,输出如下:

id: 1, name: John


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号