8

我想在部署在Glassfish上的Java EE應用程序中的同一事務中使用2個持久性單元。EJB3 - 在事務中使用2個持久性單元(例外:本地事務已經有1個非XA資源)

的2個持久性單元在persistence.xml中所定義,如下:

<persistence-unit name="BeachWater"> 
<jta-data-source>jdbc/BeachWater</jta-data-source> 
... 
<persistence-unit name="LIMS"> 
<jta-data-source>jdbc/BeachWaterLIMS</jta-data-source> 
... 

這些持久性單元對應於JDBC資源和我在Glassfish的已定義如下連接池(包括一個這裏因爲二者都是除了名稱相同&數據庫連接信息):

JDBC Resource: 
JNDI Name: jdbc/BeachWaterLIMS 
Pool Name: BEACHWATER_LIMS 

Connection Pool: 
Name: BEACHWATER_LIMS 
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource 
Resource Type: javax.sql.ConnectionPoolDataSource 

有3個無狀態會話bean,LimsServiceBean,AnalysisServiceBean和AnalysisDataTransformationServiceBean。

下面是相關片段從LimsServiceBean:

@PersistenceContext(unitName = "LIMS") 
EntityManager em; 
... 
public ArrayList<Sample> getLatestLIMSData() { 
    Query q = em.createNamedQuery("Sample.findBySubTypeStatus"); 
    return new ArrayList<Sample>(q.getResultList()); 
} 

從AnalysisServiceBean:

@PersistenceContext(unitName = "BeachWater") 
EntityManager em; 
... 
public ArrayList<AnalysisType> getAllAnalysisTypes() { 
    Query q = em.createNamedQuery("AnalysisType.findAll"); 
    return new ArrayList<AnalysisType>(q.getResultList()); 
} 

而且從AnalysisDataTransformationServiceBean:

@EJB 
private AnalysisService analysisService; 

@EJB 
private LimsService limsService; 

public void transformData() { 
    List<AnalysisType> analysisTypes = analysisService.getAllAnalysisTypes(); 
    ArrayList<Sample> samples = limsService.getLatestLIMSData(); 

這調用limsService.getLatestLIMSData()引起以下例外:

 [exec] Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
[exec] Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources. 

經徵詢本頁面,http://msdn.microsoft.com/en-us/library/ms378484.aspx(以及許多其他),我試圖改變連接池的定義:通過GlassFish管理控制檯

Connection Pool: 
Name: BEACHWATER_LIMS 
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerXADataSource 
Resource Type: javax.sql.XADataSource 

Ping成功,但打電話給analysisService。 getAllAnalysisTypes()現在拋出異常:

Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: javax.transaction.SystemException 

The resource manager is doing work outside a global transaction javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Failed to create the XA control connection. Error: "Could not find stored procedure 'master..xp_sqljdbc_xa_init_ex'." 

任何想法?

+0

可能的重複[如何防止「本地事務已經有1個非XA資源」異常?](https://stackoverflow.com/questions/2687121/how-to-prevent-local-transaction-already-has -1-non-xa-resource-exception) – 2017-08-26 14:33:37

回答

6

更改配置:

Connection Pool: 
Name: BEACHWATER_LIMS 
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerXADataSource 
Resource Type: javax.sql.XADataSource 

按照第塞特希維文的博客的步驟,「如何使MSSQL服務器XA數據源的工作?」這裏,http://www.senthilb.com/2010/01/how-to-make-xa-datasource-work-in-mssql.html

重新啓動Glassfish。

+0

感謝您的反饋意見。 – 2010-04-15 13:05:04

4

爲了在事務中使用兩個持久性單元(以及兩個數據源),您確實需要使用XA連接並相應地配置您的池(至少其中之一,GlassFish支持最後一次代理優化,允許請註冊一個非XA資源,請參閱http://docs.sun.com/app/docs/doc/820-7695/beanm?a=view)。這是第一個錯誤。

對於第二個錯誤,似乎很難說與目前的詳細程度。你能否提供堆棧跟蹤(如果需要,激活更精細的日誌記錄)?在Glassfish的連接池的

+0

謝謝Pascal。我已經在日誌中發現了更多詳細信息: 資源管理器正在全局事務之外進行工作 javax.transaction.xa.XAException:com.microsoft.sqlserver.jdbc.SQLServerException:無法創建XA控件連接。錯誤:「找不到存儲過程'master..xp_sqljdbc_xa_init_ex'。」 我在這裏找到了一個建議的解決方案,http://www.senthilb.com/2010/01/how-to-make-xa-datasource-work-in-mssql.html並請求在服務器上進行相關更改。當我重新測試時會在這裏更新。 – Sorcha 2010-04-11 18:56:17

+0

@Sorcha感謝您的反饋。不要猶豫,在更新後留下評論,以便通知我。但我有這樣的感覺,你在正確的軌道上! – 2010-04-11 21:20:41

+0

查看答案已添加。現在完美運作。再次感謝您的貢獻。 – Sorcha 2010-04-15 11:17:57

相關問題