You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从外部进程连接Quarkus应用中的内存H2数据库

Quarkus内存H2数据库外部连接解决方案

问题根源

默认的jdbc:h2:mem:采用进程内模式,仅允许当前JVM进程访问,不会自动启动TCP服务器,因此外部工具(如DataGrip)无法直接连接到Quarkus应用的内存H2实例。

解决步骤

1. 在Quarkus应用中启动H2 TCP服务器

通过Quarkus的@Startup注解,在应用启动时初始化H2 TCP服务器,让内存库对外暴露端口:

import io.quarkus.runtime.Startup;
import org.h2.tools.Server;
import javax.enterprise.context.ApplicationScoped;
import java.sql.SQLException;

@Startup
@ApplicationScoped
public class H2TcpServerInitializer {
    private Server tcpServer;

    // 应用启动时自动执行构造方法启动TCP服务器
    public H2TcpServerInitializer() throws SQLException {
        // 启动TCP服务器,监听9092端口,允许外部连接
        tcpServer = Server.createTcpServer(
            "-tcp",
            "-tcpAllowOthers",
            "-tcpPort", "9092"
        ).start();
    }
}

确保项目已引入Quarkus H2依赖(quarkus-jdbc-h2),否则无法调用H2的Server工具类。

2. 统一应用与外部工具的JDBC连接字符串

修改Quarkus应用的数据库连接配置,改用TCP模式连接内存库,确保应用和外部工具访问同一个实例:

# application.properties 中的配置
quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost:9092/mem:quarkus_db;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1;MODE=MariaDB
quarkus.datasource.username=sa
quarkus.datasource.password=

3. 配置DataGrip等外部工具连接

  • 驱动选择:H2
  • 连接URL:直接使用上面的字符串 jdbc:h2:tcp://localhost:9092/mem:quarkus_db;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1;MODE=MariaDB
  • 用户名:sa,密码留空(默认配置)

关于示例逻辑的说明

你看到的示例中,应用能通过jdbc:h2:mem:连接,外部工具用TCP连接访问,本质是示例代码中隐含了启动H2 TCP服务器的逻辑,只是没有明确展示。如果不手动启动TCP服务器,进程内的内存H2库完全隔离在应用JVM内,外部无法访问。

注意事项

  • 应用停止后,内存H2数据库的数据会立即丢失,仅适合运行时验证数据场景。
  • 若测试环境需要持久化数据,可改用文件模式的H2数据库,但不符合你当前的需求。

内容的提问来源于stack exchange,提问作者user4695271

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:10:20