如何使用 Quarkus 在服务器模式下启动 H2?

时间:2021-04-09 20:38:32

标签: java h2 quarkus

我在 Quarkus 的开发模式下使用 H2 数据库。当我需要使用客户端作为 DBeaver 访问数据库时,我以混合模式启动 H2,如下所示:

quarkus.datasource.jdbc.url=jdbc:h2:~/h2/oracle_test;MODE=Oracle;AUTO_SERVER=TRUE

这些天,我发现如果我在没有在 quarkus.datasource.jdbc.url 中传递 application.properties 属性的情况下启动 Quarkus,例如:

quarkus.datasource.db-kind=h2
quarkus.datasource.username=test
quarkus.datasource.password=test

Quarkus 自动为我在服务器模式下启动 H2 数据库:

[INFO] H2 database started in TCP server mode; server status: TCP server running at tcp://127.0.1.1:40003 (only local connections)

在这种情况下,我能够使用 DBeaver 连接到位于 localhost:40003 的 H2 服务器。

我已经使用@ConfigProperty 来发现 Quarkus 传递给这个参数的内容:

@ConfigProperty(name = "quarkus.datasource.jdbc.url")

在我的测试中,它是 jdbc:h2:tcp://localhost:40003/mem:default;DB_CLOSE_DELAY=-1

我试图在我的属性中传递这个:

quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.driver=org.h2.Driver
quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost:40003/mem:default;DB_CLOSE_DELAY=-1

但是,当我启动 Quarkus 时,我收到此错误:

2021-04-09 17:14:57,549 WARN  [io.agr.pool] (agroal-11) Datasource '<default>': Connection is broken: "java.net.ConnectException: Connection refused (Connection refused): localhost:40003" [90067-197]
2021-04-09 17:14:57,551 WARN  [org.hib.eng.jdb.env.int.JdbcEnvironmentInitiator] (Quarkus Main Thread) HHH000342: Could not obtain connection to query metadata: org.h2.jdbc.JdbcSQLException: Connection is broken: "java.net.ConnectException: Connection refused (Connection refused): localhost:40003" [90067-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:451)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:332)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:103)
    at org.h2.Driver.connect(Driver.java:69)
    at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:200)
    at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:452)
    at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:434)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:65)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1126)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.base/java.net.Socket.connect(Socket.java:609)
    at org.h2.util.NetUtils.createSocket(NetUtils.java:103)
    at org.h2.util.NetUtils.createSocket(NetUtils.java:83)
    at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:114)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:447)
    ... 12 more

我相信我必须传递另一个参数才能使 Quarkus 在服务器模式下启动 H2 或者当我没有在任何地方传递 quarkus.datasource.jdbc.url 时 Quarkus 正在做更多的事情,也许它正在做类似 {{3 }}

我可以在不传递 quarkus.datasource.jdbc.url 参数的情况下运行我的开发模式,唯一不方便的是每次 Quarkus 选择不同的 port 到数据库中。

总而言之,我能够在混合模式下使用 H2 在开发模式下运行 Quarkus 并从客户端访问数据库。缺点是混合模式下的 H2 会创建一些文件,直接使用服务器模式运行它会很有用!

0 个答案:

没有答案