如何从外部进程连接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
相关产品推荐
相关产品推荐

