配置hibernate-orm-panache-kotlin与反应式PostgreSQL数据源报错求助
问题:Hibernate ORM Panache Kotlin 无法配合反应式PostgreSQL数据源使用
问题背景
尝试搭建hibernate-orm-panache-kotlin与反应式PostgreSQL数据源的环境,使用io.quarkus.hibernate.orm.panache.kotlin.PanacheRepositoryBase持久化数据时,抛出如下异常:
2022-09-16T12:46:44.287898821Z 2022-09-16 12:46:44,282 ERROR [org.jbo.res.rea.com.cor.AbstractResteasyReactiveContext] (vert.x-eventloop-thread-4) Request failed: java.lang.IllegalStateException: The named datasource 'default-reactive' has not been properly configured. See https://quarkus.io/guides/datasource#multiple-datasources for information on how to do that. 2022-09-16T12:46:44.287979236Z at io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations.getEntityManager(AbstractJpaOperations.java:76) 2022-09-16T12:46:44.287991304Z at io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations.getEntityManager(AbstractJpaOperations.java:51) 2022-09-16T12:46:44.287995544Z at io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations.persist(AbstractJpaOperations.java:93) 2022-09-16T12:46:44.287999109Z at io.quarkus.hibernate.orm.panache.kotlin.PanacheRepositoryBase$DefaultImpls.persistAndFlush(PanacheRepositoryBase.kt:61) 2022-09-16T12:46:44.288002631Z at com.payxpert.exchangerate.data.repository.ExchangeRateRepository.persistAndFlush(ExchangeRateRepository.kt:8) 2022-09-16T12:46:44.288006234Z at com.payxpert.exchangerate.data.repository.ExchangeRateRepository.persistAndFlush(ExchangeRateRepository.kt:8) 2022-09-16T12:46:44.288009583Z at com.payxpert.exchangerate.data.repository.ExchangeRateRepository_ClientProxy.persistAndFlush(Unknown Source) 2022-09-16T12:46:44.288012970Z at com.payxpert.exchangerate.service.ExchangeRateService.getExchangeRate$suspendImpl(ExchangeRateService.kt:32) 2022-09-16T12:46:44.288016345Z at com.payxpert.exchangerate.service.ExchangeRateService.getExchangeRate(ExchangeRateService.kt) 2022-09-16T12:46:44.288019769Z at com.payxpert.exchangerate.service.ExchangeRateService_ClientProxy.getExchangeRate(Unknown Source) 2022-09-16T12:46:44.288023053Z at com.payxpert.exchangerate.controller.ExchangeRateController.getExchangeRate$suspendImpl(ExchangeRateController.kt:25) 2022-09-16T12:46:44.288026472Z at com.payxpert.exchangerate.controller.ExchangeRateController.getExchangeRate(ExchangeRateController.kt) 2022-09-16T12:46:44.288029972Z at com.payxpert.exchangerate.controller.ExchangeRateController$quarkuscoroutineinvoker$getExchangeRate_66c797082ca56a703eb08f34be10b1d88f61d5f8.invokeCoroutine(Unknown Source) 2022-09-16T12:46:44.288033458Z at org.jboss.resteasy.reactive.server.runtime.kotlin.CoroutineInvocationHandler$handle$1.invokeSuspend(CoroutineInvocationHandler.kt:40) 2022-09-16T12:46:44.288038057Z at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-09-16T12:46:44.288041480Z at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-09-16T12:46:44.288059843Z at org.jboss.resteasy.reactive.server.runtime.kotlin.VertxDispatcher.dispatch$lambda-0(ApplicationCoroutineScope.kt:39) 2022-09-16T12:46:44.288073680Z at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:264) 2022-09-16T12:46:44.288077043Z at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:246) 2022-09-16T12:46:44.288080285Z at io.vertx.core.impl.EventLoopContext.lambda$runOnContext$0(EventLoopContext.java:43) 2022-09-16T12:46:44.288083420Z at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) 2022-09-16T12:46:44.288086529Z at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) 2022-09-16T12:46:44.288089694Z at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) 2022-09-16T12:46:44.288092851Z at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) 2022-09-16T12:46:44.288095983Z at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) 2022-09-16T12:46:44.288099147Z at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) 2022-09-16T12:46:44.288102260Z at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 2022-09-16T12:46:44.288105519Z at java.base/java.lang.Thread.run(Thread.java:829)
切换为hibernate-reactive-panache后,所有功能均正常运行。
原因分析与结论
hibernate-orm-panache-kotlin本身不支持反应式数据源,具体原因如下:
hibernate-orm-panache(含Kotlin版本)基于传统JPA/Hibernate ORM构建,依赖阻塞式JDBC数据源,而非反应式数据源;- 反应式数据源是为
hibernate-reactive及其Panache封装hibernate-reactive-panache设计的,两者底层运行模型完全不同:前者是阻塞式同步模型,后者是基于Vert.x的非阻塞反应式模型; - 异常中提到的
default-reactive是反应式数据源的标识,但hibernate-orm-panache无法识别和使用这类数据源,它需要的是标准JDBC数据源配置。
解决方案
- 若要使用反应式数据源,必须搭配
hibernate-reactive-panache-kotlin(即你切换后正常工作的方案); - 若坚持使用
hibernate-orm-panache-kotlin,需改为配置阻塞式JDBC数据源,而非反应式数据源。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

