问题描述
我使用 quarkus-narayana-jta 进行事务管理,并使用反应式 MysqLPool 插入数据库。 MysqLPool 类不是 Autoclosable 所以我们是否需要从 Pool 类中显式调用 close() 方法以在发生故障时关闭,或者只是将错误消息打印到日志并让事务管理器在发生故障时回滚整个事务是否可以.如果没有明确关闭 MysqLPool 会有什么影响。
@Transactional
public Uni<String> insertIntoDb(BaseLog baseLog) {
LocalDate currentDate = LocalDate.Now();
int year = currentDate.getYear();
if (baseLog instanceof RequestLog) {
prepareRequestLogData(baseLog,currentDate,year);
}
if (baseLog instanceof ResponseLog) {
prepareResponseLogData(baseLog,year);
}
return MysqLPool.preparedQuery(query).execute().onItem()
.transformToUni(id -> MysqLPool
.query("SELECT TRAN_ID FROM " + tableName + " ORDER BY TO_DB_TS DESC LIMIT 1").execute())
.onItem().transform(rows -> rows.iterator().next().getString(0)).onFailure().invoke(f -> {
LOG.error("Error while inserting data to " + tableName + " table::" + f.getMessage());
});
}
解决方法
反应式 SQL 池未与 @Transactional
和传统的 TransactionManager(例如 Narayana)集成。
如果您使用反应式 SQL,您需要明确地打开/关闭连接,并明确地开始/结束事务。
如果您将 Hibernate Reactive 与 Panache 结合使用,则可以使用 @ReactiveTransactional
。