2010-04-21 4 views
6

Я использую 2 PU в безгосударственного EJB и каждый из них вызывается на один метод:Как предотвратить «Локальная транзакция уже имеет 1 исключение не-XA»?

@PersistenceContext(unitName="PU") 
private EntityManager em; 
@PersistenceContext(unitName="PU2") 
private EntityManager em2; 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void getCandidates(final Integer eventId) throws ControllerException { 
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId); 
    ... 
    Person person = getPerson(candidate.getLogin()); 
    ... 
} 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
private Person getPerson(String login) throws ControllerException { 
    Person person = em2.find(Person.class, login); 
    return person; 
} 

Эти методы с аннотацией REQUIRES_NEW transcaction, чтобы избежать этого исключения. Когда я вызывал этот метод из javaFX-апплета, все работало так, как ожидалось. Теперь я пытаюсь назвать их из JAX-RS webservice (я не вижу никакой логической разницы, так как в обоих случаях ejb просматривался в исходном контексте), и я продолжаю получать это исключение. Когда я установил XADatasource в пулах соединений Glassfish 2.1, я получил исключение nullpointer на em2.

Любые идеи, что попробовать дальше?

С уважением

+0

См. Также http://stackoverflow.com/questions/2413911/if-i-access-usertransaction-does-this-mean-that-i-use-2-phase-commit-or-xa/2425585#2425585 – ewernli

ответ

5

ОК,

Решено сейчас. Я поделюсь на всякий случай, когда кого-то схватят аналогичную вещь. Вся проблема заключалась в развертывании netbeans. Они перезаписывают настройки в пуле подключения в стеклянную сетку, и когда вы устанавливаете их надлежащим образом во время выполнения, вы получаете npe или отсутствующий пароль глупым материалом. Место для редактирования: sun-resources.xml. Элемент XML имеет атрибуты datasource-classname и rs-type. Что необходимо сделать в случае базы данных Дерби:

<jdbc-connection-pool ... 
     datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
     res-type="javax.sql.XADataSource"> 
    ... 
</jdbc-connection-pool> 

Работает как очарование.

2

Я использую 2 PU в безгосударственном EJB и каждый из них вызываются на одном методе

Действительно. Но вы вызываете второй метод из первого, так что вы делаете распределенную транзакцию, и вам нужно использовать XA для этого (по крайней мере, для одного из ресурсов, поскольку GlassFish поддерживает last agent optimization, что позволяет задействовать один ресурс, не относящийся к XA) , Другими словами, установка одного из ваших источников данных как XADataSource - это путь.

Если вы получили сообщение об ошибке, добавьте подробности о том, что вы сделали точно и стек.

+0

Спасибо, я пошлю его как можно скорее, но в том смысле, есть ли способ указать XADataSource в persistence.xml? Я не могу найти его нигде, и каждый раз, когда я развертываю через netbeans, параметр glassfish в пуле соединений возвращается к простому DataSource. – zeratul021

1

При вызове второго метода из первого, это не вызов метода EJB. Он рассматривает его как обычный вызов метода и не смотрит на @TransactionAttribute. Если вы хотите позвонить одному и тому же EJB, вы можете ввести SessionContext и позвонить getBusinessObject. Затем вызовите метод на возвращаемом EJB.

Смежные вопросы