Как предотвратить “Локальную транзакцию, уже имеет 1 Ресурс non-XA” исключение?

Я использую 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.

Какие-либо идеи, что попробовать затем?

С уважением

8
задан zeratul021 21 April 2010 в 22:56
поделиться

2 ответа

Хорошо,

теперь решено. Я поделюсь на случай, если кто-то столкнется с подобной проблемой. Вся проблема была в развертывании 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>

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

6
ответ дан 5 December 2019 в 17:35
поделиться

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

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

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

3
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: