H2 使用 H2 服务器

H2 目前支持三个服务器:web 服务器(用于 H2 控制台)、TCP 服务器(用于客户端/服务器连接)和 PG 服务器(用于 PostgreSQL 客户端)。

请注意,只有 web 服务器支持浏览器连接。启动服务器有多种方式,其中一种是使用服务器工具。启动服务器并不会打开数据库 —— 数据库会在客户端连接后立即打开。

从命令行启动服务器工具

要使用默认设置从命令行启动服务器工具,请运行:

java -cp h2*.jar org.h2.tools.Server

这将以默认选项启动工具。更多示例:

// 把数据库文件存储在指定的 /var/data/h2 目录中
java -cp h2*.jar org.h2.tools.Server -baseDir /var/data/h2

// 在最后一个连接关闭后 30 秒自动关闭数据库
java -cp h2*.jar org.h2.tools.Server -dbCloseDelay 30

// 指定 TCP 连接的端口为 9092,Web 控制台端口为 9093
java -cp h2*.jar org.h2.tools.Server -tcpPort 9092 -webPort 9093

// 允许其他计算机通过 TCP 连接到数据库服务器
// 允许其他计算机通过 Web 控制台访问数据库服务器
java -cp h2*.jar org.h2.tools.Server -tcpAllowOthers -webAllowOthers

要获取更多的选项列表和默认值,请运行:

java -cp h2*.jar org.h2.tools.Server -?

示例:

C:\Users\Administrator\Desktop\h2\bin>java -cp h2-2.3.232.jar org.h2.tools.Server -?
Starts the H2 Console (web-) server, TCP, and PG server.
Usage: java org.h2.tools.Server <options>
When running without options, -tcp, -web, -browser and -pg are started.

 Options are case sensitive.
Supported options[-help] or [-?]Print the list of options
[-web]  使用 H2 控制台启动 web 服务器
[-webAllowOthers]  允许其他计算机连接
[-webExternalNames]  以逗号分隔的服务器外部名称和 IP 地址列表,与 -webAllowOthers 一起使用
[-webDaemon]  使用守护进程线程
[-webPort <port>]   端口(默认:8082)
[-webSSL]   使用加密(HTTPS)连接
[-webAdminPassword]   DB 控制台管理员密码
[-browser]   启动浏览器连接 web 服务器
[-tcp]   启动 TCP 服务器
[-tcpAllowOthers]  允许其他计算机连接
[-tcpDaemon]   使用守护进程线程
[-tcpPort <port>]   端口(默认值:9092)
[-tcpSSL]   使用加密(SSL)连接
[-tcpPassword <pwd>]    关闭 TCP 服务器的密码
[-tcpShutdown "<url>"]   停止 TCP 服务器;例如:tcp://localhost
[-tcpShutdownForce]   不等待关闭所有连接
[-pg]   启动 PG 服务器
[-pgAllowOthers]   允许其他计算机连接
[-pgDaemon]   使用守护进程线程
[-pgPort <port>]   端口(默认:5435)
[-properties "<dir>"]   服务器属性(默认:~,禁用:空)
[-baseDir <dir>]   H2 数据库的基本目录(所有服务器)
[-ifExists]   只能打开现有数据库(所有服务器)
[-ifNotExists]   访问时创建数据库
[-trace]   打印额外的跟踪信息(所有服务器)
[-key <from> <to>]   允许将一个数据库名称映射到另一个数据库名称(所有服务器)
The options -xAllowOthers are potentially risky.

 For details, see Advanced Topics / Protection against Remote Access.
See also https://h2database.com/javadoc/org/h2/tools/Server.html

连接到 TCP 服务器

如果我们要使用 JDBC 连接到远程 H2 数据库,请使用以下格式的数据库 URL:

jdbc:h2:tcp://localhost/~/test

其中,~ 表示用户主目录,tcp://localhost/~/test 表示连接远程主机 localhost 上,用户主目录下的 test 数据库文件。

请注意,您不能使用 web 浏览器连接此 URL,只能使用 H2 客户端(通过 JDBC)连接。

示例:

Connection connection = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test");
Statement statement = connection.createStatement();
statement.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(255))");
statement.execute("TRUNCATE TABLE users"); // 清空表
statement.execute("INSERT INTO users VALUES (1, '张三')"); // 插入一条数据
statement.close();
connection.close();

在应用程序中启动 TCP 服务器

除了命令行启动 H2 服务器,也可以在应用程序中启动和停止服务器。示例代码:

import org.h2.tools.Server;
...
// 启动 TCP 服务器
Server server = Server.createTcpServer(args).start();
...
// 停止 TCP 服务器
server.stop();

例如:

public static void main(String[] args) {
    try {
        // 启动 tcp 和 web 服务,如果数据库不存在,则自动创建
        Server.createTcpServer("-tcp","-web","-ifNotExists").start();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

从另一个进程停止 TCP 服务器

H2 允许从另一个进程停止 TCP 服务器,要从命令行停止服务器,请运行:

java org.h2.tools.Server -tcpShutdown tcp://localhost:9092 -tcpPassword password

要从用户应用程序停止服务器,请使用以下代码:

org.h2.tools.Server.shutdownTcpServer("tcp://localhost:9092", "password", false, false);

此函数只会停止 TCP 服务器。如果在同一进程中启动了其他服务器,它们将继续运行。为避免下次打开数据库时出现未知问题,应在调用此方法前关闭与数据库的所有连接。

注意、要停止远程服务器,必须在服务器上启用远程连接。并且可使用选项 -tcpPassword 保护关闭 TCP 服务器(启动和停止 TCP 服务器必须使用相同的密码)。

TLS 连接

使用 Java 安全套接字扩展(SSLServerSocket、SSLSocket)支持远程 TLS 连接。

要使用自己的密钥存储,请在启动 H2 服务器和客户端之前设置系统属性 javax.net.ssl.keyStore 和 javax.net.ssl.keyStorePassword。

注意:点击查看“自定义默认密钥和信任存储,存储类型和存储密码”相关信息。

示例:

jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:ssl://localhost:8085/~/sample;

上述 URL 中,除了 ssl,其他字段没有什么变化。

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