1

我正在尝试使用 Quarkus,构建一个小型 REST 应用程序。为此,我选择使用 Agroal 数据源,但既不使用 Panache 也不使用普通 Hibernate(如他们的示例所示),而是使用普通 JDBC。

对于数据库交互,我创建了一个注入 AgroalDataSource 并使用它打开数据库连接的小型服务。所述服务公开了两种方法,一种用于不运行事务查询,另一种用于运行事务查询。对于第一部分,一切正常,但是当我尝试更新数据库条目时,尝试提交连接时操作失败。

 public <E> E update(TransactionalRunner<E> runner) {
    try (var connection = dataSource.getConnection()) {
        return attemptTransactional(runner, connection);
    } catch (SQLException e) {
        log.error("Establishing a database connection has failed", e);
        throw new DataAccessException(e);
    }
 }

private <E> E attemptTransactional(TransactionalRunner<E> runner, Connection connection) {
    try {
        connection.setAutoCommit(Boolean.FALSE);
        E result = runner.run(new QueryRunner(), connection);
        connection.commit();
        return result;
    } catch (SQLException e) {
       try {
           log.error("Committing a transaction has failed. Attempting rollback", e);
           DbUtils.rollback(connection);
           throw new DataAccessException(e);
       } catch (SQLException ex) {
           log.error("Rolling back a transaction has failed. Giving up...", ex);
           throw new DataAccessException(ex);
       }
    }
}

我得到的堆栈跟踪如下:

2019-12-21 14:25:59,350 ERROR [com.ari.rev.dat.DatabaseAccessService] (vert.x-worker-thread-1) Committing a transaction has failed. Attempting rollback: java.sql.SQLException: Attempting to commit while taking part in a transaction
        at io.agroal.pool.wrapper.ConnectionWrapper.commit(ConnectionWrapper.java:183)
        at com.ariskourt.revolut.database.DatabaseAccessService.attemptTransactional(DatabaseAccessService.java:44)
        at com.ariskourt.revolut.database.DatabaseAccessService.update(DatabaseAccessService.java:33)
        at com.ariskourt.revolut.database.DatabaseAccessService_ClientProxy.update(DatabaseAccessService_ClientProxy.zig:114)
        at com.ariskourt.revolut.services.AccountTransferService.transferAmount(AccountTransferService.java:66)
        at com.ariskourt.revolut.services.AccountTransferService_Subclass.transferAmount$$superaccessor2(AccountTransferService_Subclass.zig:164)
        at com.ariskourt.revolut.services.AccountTransferService_Subclass$$function$$2.apply(AccountTransferService_Subclass$$function$$2.zig:51)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:119)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:92)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:32)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:53)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:26)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(TransactionalInterceptorRequired_Bean.zig:168)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)

我正在使用 Quarkus 提供的默认 Agroal 数据源,没有任何自定义配置。至于QueryRunner这些只是 Apache DbUtils 套件的一部分。

有没有人知道如何解决这个问题?

4

0 回答 0