मैं ग्लासफ़िश पर तैनात जावा ईई अनुप्रयोग में एक ही लेनदेन के भीतर 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'."
कोई विचार?
संभावित डुप्लिकेट [स्थानीय लेनदेन में पहले से ही 1 गैर-एक्सए संसाधन "अपवाद कैसे है?] (Https://stackoverflow.com/questions/2687121/how-to-prevent-local-transaction-already-has -1-गैर-एक्सए-संसाधन-अपवाद) –