Quarkus中JDBC与Reactive数据源连接池关联及验证问询
Quarkus中JDBC与Reactive数据源连接池的独立性验证
问题1:JDBC与Reactive数据源是否共享连接池?禁用JDBC连接池会影响Reactive池吗?
JDBC(基于Agroal)和Reactive(基于PgPool)数据源在Quarkus中是完全独立的连接池实现,彼此不存在共享关系:
- Agroal是Quarkus针对JDBC规范实现的连接池,属于
quarkus-jdbc-postgresql和quarkus-agroal扩展;PgPool是基于Vert.x PostgreSQL响应式驱动实现的连接池,属于quarkus-reactive-pg-client扩展,两者分属不同模块,配置和运行逻辑完全隔离。 - 设置
QUARKUS_DATASOURCE_JDBC_POOLING_ENABLED=false只会禁用JDBC侧的Agroal连接池,对Reactive的PgPool没有任何影响。禁用后JDBC操作会每次创建临时连接(用完即销毁),而Reactive数据源仍会正常使用自己的连接池处理请求。
问题2:验证该行为的方法
可以通过以下几种方式验证两者的独立性:
- 查看启动日志:Quarkus启动时会分别输出JDBC和Reactive数据源的初始化日志。禁用JDBC池后,日志中会出现
Agroal data source '<default>' has been disabled (pooling is disabled)的提示;同时Reactive侧会打印Creating reactive pg pool for datasource '<default>'的初始化信息,说明Reactive池正常启动。 - 数据库连接数监控:直接查询Postgres数据库的连接状态:
执行Reactive SQL操作后,会看到SELECT usename, application_name, state FROM pg_stat_activity;application_name为vertx-pg-client的连接;触发JDBC Copy操作时,会临时出现application_name为PostgreSQL JDBC Driver的连接(用完即消失),且Reactive连接数不受JDBC操作影响。 - 代码层面校验:
- 注入
AgroalDataSource,调用其getMetrics().getActiveCount(),禁用池后该值始终为0(因为每次用临时连接,不会存入池); - 注入
PgPool,调用pool.size()查看当前Reactive池的连接数,执行Reactive操作后该值会根据配置的池大小变化,证明Reactive池正常工作。
- 注入
- 配置隔离测试:修改Reactive池的配置(例如
quarkus.datasource.reactive.max-size=5),执行批量Reactive操作,观察数据库中Reactive连接数最多为5;再修改JDBC池的配置(若重新启用),不会影响Reactive连接数的上限,反之亦然。
内容的提问来源于stack exchange,提问作者Lance Pu
相关产品推荐
相关产品推荐

