无法为Quarkus反应式数据源配置queryTimeout与connection keepAlive
Quarkus反应式Oracle客户端:配置查询超时与连接保活
查询超时(queryTimeout)
Quarkus官方文档未直接提供全局queryTimeout配置项,但可通过以下两种方式实现查询超时控制:
1. 单查询级别设置超时
编写反应式查询时,直接调用Vert.x Oracle Client API的超时方法,针对单个查询生效:
client.preparedQuery("SELECT * FROM users WHERE id = ?") .timeout(5, TimeUnit.SECONDS) // 设置5秒查询超时 .execute(Tuple.of(1)) .subscribe(result -> { // 处理结果 }, error -> { // 处理超时异常 });
2. 全局默认超时配置
通过Quarkus的配置项传递Vert.x Oracle Client底层参数,在application.properties中添加全局默认超时:
quarkus.datasource.reactive.oracle.connect-options.statement-timeout=5
该配置会映射到Vert.x的OracleConnectOptions.setStatementTimeout()方法,单位为秒,对所有查询生效。
连接保活(keepAlive)
连接保活需从TCP网络层和Oracle会话层两方面配置:
1. TCP层连接保活
通过Quarkus配置Vert.x的TCP保活参数,在application.properties中添加:
quarkus.datasource.reactive.oracle.connect-options.tcp-keep-alive=true quarkus.datasource.reactive.oracle.connect-options.tcp-keep-idle=300 quarkus.datasource.reactive.oracle.connect-options.tcp-keep-interval=60 quarkus.datasource.reactive.oracle.connect-options.tcp-keep-count=5
参数说明:
tcp-keep-alive:开启TCP保活机制tcp-keep-idle:连接空闲300秒后开始发送保活探测包tcp-keep-interval:保活探测包的发送间隔为60秒tcp-keep-count:连续5次未收到响应则判定连接失效
2. Oracle会话层保活
可通过Oracle服务器端的sqlnet.ora配置SQLNET.EXPIRE_TIME参数,让服务器定期检查客户端连接:
SQLNET.EXPIRE_TIME=10
此配置会让Oracle服务器每隔10分钟向客户端发送探测包,无响应则关闭连接。若无法修改服务器配置,可在客户端定期执行轻量心跳查询,比如:
// 每隔5分钟执行一次心跳 Vertx.vertx().setPeriodic(5 * 60 * 1000, id -> { client.query("SELECT 1 FROM DUAL") .execute() .subscribe(); });
注意:以上配置需确保使用Quarkus 2.13及以上版本的反应式Oracle客户端,部分参数在旧版本中可能未支持。
内容的提问来源于stack exchange,提问作者ashutosh5111
相关产品推荐
相关产品推荐

