Как настроить Narayana ConnectionManager, чтобы он не останавливался после некоторых транзакций - PullRequest
0 голосов
/ 05 октября 2019

Я использую Spring Boot, Spring Session и JTA Narayana (arjuna), я отправляю операторы выбора и вставки в цикл, используя два разных потока.

Приложение некоторое время работает правильно, но послеНекоторое количество транзакций, 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)

Исходный код находится в github https://github.com/saavedrah/multidataset-test

Мне интересно, если соединение должнобыть закрытым или если мне нужно изменить некоторые настройки в Arjuna, чтобы заставить работать ConnectionManager.

1 Ответ

0 голосов
/ 21 октября 2019

, хотя вы показываете, что трассировка стека печатается классом Narayana BasicAction (а не исключением), результат для вас в конечном итоге тот же, и вам нужно закрыть свои соединения.

Скорее всего, вам стоит добавить его ближе к тому же месту, где вы выполняете вызовы getConnection в https://github.com/saavedrah/multidataset-test/blob/cf910c345db079a4e910a071ac0690af28bd3f81/src/main/java/com/mono/multidatasourcetest/db/PrepareStatementExec.java#L38

например,

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

Но так как соединениеАвтозаполнение вы можете просто сделать:

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