Использование UserTransaction в параллельных потоках - PullRequest
0 голосов
/ 29 ноября 2018

В JBOSS 6 я тестирую метод, который подключается к базе данных SQL и обновляет некоторые таблицы.Теперь я хочу выполнить этот метод, но в несколько потоков, чтобы увеличить производительность.

Поэтому я хочу сделать что-то вроде этого:

Сначала у меня есть класс потока:

class TransactionThread extends Thread {
    UserTransaction userTransaction = app.getUserTransaction();

    @Override
    public void run() {
      userTransaction.begin();
      //TRANSACTION CODE
      userTransaction.commit(); 
    }
}

Затем я хочу создать и выполнить несколько потоков:

ArrayList <TransactionThread> threadList = new ArrayList<TransactionThread>();

for (int i = 0; i < 10; i++) {
     threadList.add(new TransactionThread());
}
for (TransactionThread item: threadList ){
     item.start();
}

Теперь проблема в том, что этот метод выполняется одновременно.Если какой-либо из потоков завершает свою транзакцию и фиксирует, что потоки, которые еще работают, также будут фиксироваться, и соединение с базой данных закроется.

Получение этой ошибки:

 javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection

Что я могуделать, чтобы избежать закрытия соединений и поддерживать одновременный метод?

РЕДАКТИРОВАТЬ: это то, что app.getUserTransaction() делает:

public UserTransaction getUserTransaction() {
    try {
        Context context = new InitialContext();
        return (UserTransaction) context
                .lookup("java:comp/UserTransaction");
    } catch (Exception e) {
        return null;
    }
}
...