首页 > 解决方案 > MySqlPool quarkus 反应式客户端不会自动关闭

问题描述

我正在使用 quarkus-narayana-jta 进行事务管理,并使用反应式 MysqlPool 插入数据库。MysqlPool 类不是可自动关闭的,所以我们是否需要从 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, currentDate, 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());
            });

}

标签: javaamazon-rdsredhatquarkusquarkus-rest-client

解决方案


反应式 SQL 池不与@Transactional传统的事务管理器(如 Narayana)集成。

如果您使用 Reactive SQL,您需要显式打开/关闭连接,并显式开始/结束事务。

如果您将 Hibernate Reactive 与 Panache 一起使用,则可以使用@ReactiveTransactional.


推荐阅读