8

मैं ग्लासफ़िश पर तैनात जावा ईई अनुप्रयोग में एक ही लेनदेन के भीतर 2 दृढ़ता इकाइयों का उपयोग करने की कोशिश कर रहा हूं।ईजेबी 3 - एक लेनदेन के भीतर 2 दृढ़ता इकाइयों का उपयोग (अपवाद: स्थानीय लेनदेन में पहले से ही 1 गैर-एक्सए संसाधन है)

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 राज्यविहीन सत्र सेम, 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 

पिंग सफल होता है, लेकिन 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 गैर-एक्सए संसाधन "अपवाद कैसे है?] (Https://stackoverflow.com/questions/2687121/how-to-prevent-local-transaction-already-has -1-गैर-एक्सए-संसाधन-अपवाद) –

उत्तर

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

ग्लासफ़िश को पुनरारंभ करें।

+0

प्रतिक्रिया के लिए धन्यवाद। –

4

लेनदेन के भीतर दो दृढ़ता इकाइयों (और इस प्रकार दो डेटा स्रोत) का उपयोग करने के लिए, आपको वास्तव में एक्सए कनेक्शन का उपयोग करने और तदनुसार अपने पूल को कॉन्फ़िगर करने की आवश्यकता है (उनमें से कम से कम एक, ग्लासफ़िश अंतिम एजेंट अनुकूलन का समर्थन करता है एक गैर एक्सए संसाधन को सूचीबद्ध करें, http://docs.sun.com/app/docs/doc/820-7695/beanm?a=view देखें)। वह पहली त्रुटि के लिए था।

दूसरी त्रुटि के लिए, वर्तमान विवरण के साथ कुछ भी कहना मुश्किल लगता है। क्या आप स्टैक ट्रेस प्रदान कर सकते हैं (यदि आवश्यक हो तो बेहतर लॉगिंग सक्रिय करें)? Glassfish में कनेक्शन पूल के विन्यास

+0

धन्यवाद पास्कल।मैं के बाद से लॉग में और अधिक विस्तार की खोज की है: संसाधन प्रबंधक एक वैश्विक लेनदेन javax.transaction.xa.XAException बाहर काम कर रहा है: com.microsoft.sqlserver.jdbc.SQLServerException: XA नियंत्रण कनेक्शन बनाने में विफल। त्रुटि: "संग्रहित प्रक्रिया नहीं मिली" मास्टर..xp_sqljdbc_xa_init_ex '। " मुझे यहां एक सुझाए गए समाधान मिले, http://www.senthilb.com/2010/01/how-to-make-xa- डेटासोर्स-work-in-mssql.html और सर्वर पर प्रासंगिक परिवर्तनों का अनुरोध किया है। जब मैं पुनः प्रयास करता हूं तो यहां अपडेट होगा। – Sorcha

+0

@ सोचा प्रतिक्रिया के लिए धन्यवाद। अपडेट के बाद टिप्पणी छोड़ने में संकोच न करें ताकि मुझे अधिसूचित किया जा सके। लेकिन मुझे लगता है कि आप सही रास्ते पर हैं! –

+0

उत्तर जोड़ा गया देखें। अब पूरी तरह से काम करता है। आपके योगदान के लिए फिर से धन्यवाद। – Sorcha

संबंधित मुद्दे