В 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;
}
}