2010-04-21 48 views
6

我在無狀態EJB使用2 PU和他們每個人的調用一個方法:如何防止「本地事務已有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 applet調用這些方法時,所有方法都按預期工作。現在我試圖從JAX-RS webservice中調用它們(我沒有看到任何邏輯上的差異,因爲在這兩種情況下,ejb都是在初始上下文中查找的),並且我不斷收到此異常。當我在glassfish 2.1連接池中設置XADatasource時,em2上出現空指針異常。

任何想法接下來要嘗試什麼?

的問候,我在無狀態EJB使用2 PU

+0

另請參閱http://stackoverflow.com/questions/2413911/if-i-access-usertransaction-does-this-mean-that-i-use-2-phase-commit-or-xa/2425585#2425585 – ewernli 2010-04-22 06:27:09

回答

5

好吧,

現在就解決了。我會分享,以防有人被類似的東西解決。 整個問題與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

和他們每個人的調用一個方法

確實。但是您從第一個方法調用第二個方法,因此您正在執行分佈式事務,並且您需要使用XA(至少對於其中一個資源,因爲GlassFish支持允許涉及一個非XA資源的last agent optimization) 。換句話說,將您的一個數據源設置爲XADataSource即可。

如果您在執行此操作時遇到錯誤,請添加有關您執行的操作的詳細信息和堆棧跟蹤。

+0

謝謝,我會盡快發佈它,但在意圖中,有沒有辦法在persistence.xml中指定XADataSource?我沒有在任何地方找到它,每次我通過netbeans進行部署時,連接池中的glassfish設置都恢復爲普通的DataSource。 – zeratul021 2010-04-22 07:20:34

1

從第一個方法調用第二個方法時,它不是EJB方法調用。它將它視爲只是一個常規的方法調用,並不看@TransactionAttribute。如果您想調用相同的EJB,則可以注入SessionContext並致電getBusinessObject。然後在返回的EJB上調用該方法。