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

Java 如何使用Quarkus在服务器模式下启动H2?,java,h2,quarkus,Java,H2,Quarkus,我在Quarkus的开发模式中使用H2数据库。当我需要以客户机作为DBeaver访问数据库时,我会以混合模式启动H2,如下所示: quarkus.datasource.jdbc.url=jdbc:h2:~/h2/oracle_test;MODE=Oracle;AUTO_SERVER=TRUE 这些天来,我发现如果我启动Quarkus时没有传递应用程序.properties中的Quarkus.datasource.jdbc.url属性,比如: quarkus.datasource.db-kind

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

quarkus.datasource.jdbc.url=jdbc:h2:~/h2/oracle_test;MODE=Oracle;AUTO_SERVER=TRUE
这些天来,我发现如果我启动Quarkus时没有传递
应用程序.properties
中的
Quarkus.datasource.jdbc.url
属性,比如:

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;数据库关闭延迟=-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

2021-04-09 17:14:57549警告[io.agr.pool](agroal-11)数据源“”:连接断开:“java.net.ConnectException:连接被拒绝(连接被拒绝):本地主机:40003”[90067-197]
2021-04-09 17:14:57551警告[org.hib.eng.jdb.env.int.jdbconvironmentInitiator](Quarkus主线程)HH000342:无法获取查询元数据的连接:org.h2.jdbc.JdbcSQLException:连接已断开:“java.net.ConnectException:连接已拒绝(连接已拒绝):localhost:40003”[90067-197]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
位于org.h2.message.DbException.get(DbException.java:168)
位于org.h2.engine.SessionRemote.connectServer(SessionRemote.java:451)
位于org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:332)
JdbcConnection(JdbcConnection.java:124)
JdbcConnection(JdbcConnection.java:103)
位于org.h2.Driver.connect(Driver.java:69)
位于io.agrol.pool.ConnectionFactory.createConnection(ConnectionFactory.java:200)
在io.agrol.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:452)
在io.agrol.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:434)
位于java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
在io.agrol.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:65)
位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1126)
位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
位于java.base/java.lang.Thread.run(Thread.java:834)
原因:java.net.ConnectException:连接被拒绝(连接被拒绝)
位于java.base/java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
位于java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
位于java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
位于java.base/java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.base/java.net.Socket.connect(Socket.java:609)
位于org.h2.util.NetUtils.createSocket(NetUtils.java:103)
位于org.h2.util.NetUtils.createSocket(NetUtils.java:83)
位于org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:114)
位于org.h2.engine.SessionRemote.connectServer(SessionRemote.java:447)
... 还有12个
我相信我必须传递另一个参数以使Quarkus在服务器模式下启动H2,或者当我不传递
Quarkus.datasource.jdbc.url
时,Quarkus正在做更多的事情,可能它正在做类似的事情

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

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