【问题标题】:How to setup Narayana ConnectionManager so it doesn't stop after some transactions如何设置 Narayana ConnectionManager 使其在某些事务后不会停止
【发布时间】:2019-10-05 14:20:34
【问题描述】:

我正在使用 Spring Boot、Spring Session 和 JTA Narayana (arjuna),我正在使用两个不同的线程在一个循环中发送 select 和 insert 语句。

应用程序可以正常运行一段时间,但经过一定数量的事务后,Arjuna ConnectionManager 无法获得连接并生成以下异常:

2019-10-05 22:48:20.724  INFO 27032 --- [o-auto-1-exec-4] c.m.m.db.PrepareStatementExec            : START select
2019-10-05 22:49:20.225  WARN 27032 --- [nsaction Reaper] com.arjuna.ats.arjuna                    : ARJUNA012117: TransactionReaper::check timeout for TX 0:ffffc0a82101:c116:5d989ef0:6e in state  RUN
2019-10-05 22:49:20.228  WARN 27032 --- [Reaper Worker 0] com.arjuna.ats.arjuna                    : ARJUNA012095: Abort of action id 0:ffffc0a82101:c116:5d989ef0:6e invoked while multiple threads active within it.
2019-10-05 22:49:20.234  WARN 27032 --- [Reaper Worker 0] com.arjuna.ats.arjuna                    : ARJUNA012381: Action id 0:ffffc0a82101:c116:5d989ef0:6e completed with multiple threads - thread http-nio-auto-1-exec-10 was in progress with java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:502)
com.arjuna.ats.internal.jdbc.ConnectionManager.create(ConnectionManager.java:134)
com.arjuna.ats.jdbc.TransactionalDriver.connect(TransactionalDriver.java:89)
java.sql.DriverManager.getConnection(DriverManager.java:664)
java.sql.DriverManager.getConnection(DriverManager.java:208)
com.mono.multidatasourcetest.db.PrepareStatementExec.executeUpdate(PrepareStatementExec.java:51)

源码在githubhttps://github.com/saavedrah/multidataset-test

我想知道是否应该关闭连接,或者是否应该更改 Arjuna 中的一些设置以使 ConnectionManager 工作。

【问题讨论】:

    标签: postgresql spring-boot transactionmanager


    【解决方案1】:

    虽然您显示的是由 Narayana BasicAction 类打印的堆栈跟踪(而不是异常),但您的结果最终是相同的,您需要关闭连接。

    您很可能应该将其添加到您在 https://github.com/saavedrah/multidataset-test/blob/cf910c345db079a4e910a071ac0690af28bd3f81/src/main/java/com/mono/multidatasourcetest/db/PrepareStatementExec.java#L38 中执行 getConnection 调用的同一位置附近

    例如

    //connection = getConnection
    //do something with it
    //connection.close()
    

    但由于 Connection 是 AutoCloseable 你可以这样做:

    try (Connection connection = DriverManager.getConnection) {
        connnection.doSomething();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2011-09-15
      • 2013-12-27
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多