Как предотвратить исключение «Локальная транзакция уже имеет 1 ресурс не XA»? - PullRequest
7 голосов
/ 22 апреля 2010

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

@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, чтобы избежать этого исключения. Когда я вызывал эти методы из апплета javaFX, все работало как положено. Теперь я пытаюсь вызвать их из веб-службы JAX-RS (я не вижу логической разницы, поскольку в обоих случаях ejb просматривался в начальном контексте), и я продолжаю получать это исключение. Когда я настраивал XADatasource в пулах соединений glassfish 2.1, я получал исключение nullpointer на em2.

Есть идеи, что попробовать дальше?

Привет

Ответы [ 3 ]

5 голосов
/ 25 апреля 2010

Хорошо,

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

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

Теперь работает как шарм.

2 голосов
/ 22 апреля 2010

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

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

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

1 голос
/ 21 декабря 2011

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

...