使用服务器模式(有时也称为远程模式或客户端/服务器模式)时,应用程序使用 JDBC 或 ODBC API 远程打开数据库。H2 服务器需要在同一台虚拟机或另一台虚拟机或另一台计算机上启动。通过连接服务器,许多应用程序可以同时连接到同一个数据库。在内部,服务器进程以嵌入式模式打开数据库。
服务器模式比嵌入式模式慢,因为所有数据都是通过 TCP/IP 传输的。与所有模式一样,持久型和内存型数据库均受支持。对每个服务器同时打开的数据库数量或打开的连接数量没有限制。
使用 H2 服务器模式需要先将 H2 运行成一个服务,下面提供了多种方式去将 H2 运行成服务。
可以使用命令行来启动 H2 数据库服务器。例如,在安装了 H2 数据库的环境下,在命令行中输入类似以下的命令:
java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -web -ifNotExists
如下图:
H2 在端口 9092 上运行服务,在 8082 端口上运行控制台服务,使用控制台程序可以管理 H2 数据库。
在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表示如果数据库不存在则创建它。
这个参数用于指定H2数据库服务器在TCP模式下监听的端口号。默认的端口号是9092,但可以通过-tcpPort参数来修改。例如,如果想要将端口号改为8080,可以在启动命令中加入-tcpPort=8080。
示例用法:
java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -tcpPort=8080 -web -ifNotExists
用于指定数据库文件的基础目录。当创建或访问数据库文件时,H2会基于这个目录进行操作。这对于管理数据库文件的存储位置很有用,特别是在需要将数据库文件存储在特定目录下的情况。
示例用法:
java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir=/data/h2db -web -ifNotExists
在这个例子中,H2数据库的文件将存储在/data/h2db目录下。
当设置-trace参数时,H2数据库服务器会输出详细的跟踪信息,这有助于在调试问题时查看服务器内部的操作,如查询执行过程、连接建立过程等详细的日志信息。
示例用法:
java -cp h2-2.3.232.jar org.h2.tools.Server -tcp -tcpAllowOthers -trace -web -ifNotExists
也可以在 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。
如果采用压缩包形式安装,此时 H2 主目录下面将多一个 servcie 目录,该目录下面有 bat 脚本,这些脚本借助 wrapper.exe 将 H2 安装成 Windwos 服务,目录内容如下:
运行 1_install_serivices.bat 将 H1 安装成服务。如下图:
其他 bat 文件说明:
0_run_server_debug.bat 使用调试模式运行,如下图:
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 是一个用于将 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