2011-01-25 5 views
6

मैं एक "एपीआई" एक जार के रूप में दिया गया था मेरी जावा सीवन-हाइबरनेट appplication से कुछ बाहरी लेखा संचालन करने के लिए।कैसे को प्रबंधित लेन-देन के लिए प्रतिबद्ध करने

आंतरिक रूप से, एपीआई एक सादे हाइबरनेट आवेदन, सीवन से ही इस्तेमाल किया एक के अलावा दो स्वतंत्र डेटा स्रोतों का उपयोग कर रहा है।

मुद्दा यह है कि "API" आपरेशनों में से एक है जब एक आंतरिक .commit() कर निम्न अपवाद को जन्म देती है:

java.sql.SQLException: You cannot commit during a managed transaction! 
    at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:543) 
    at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:334) 
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115) 
    at com.other.APIAccountingImpl.moneyMovement(APIAccountingImpl.java:261) 
    at com.myapp.integration.ExternalApiIntegrator.storeAcountingData(ExternalApiIntegrator.java:125) 
    at com.myapp.session.EmployeeAccounting.persistData(EmployeeAccounting.java:123) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at ... 

moneyMovement विधि के स्रोत कोड मानक Hibernate Session transaction idiom की तरह दिखता है:

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    //do some work 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 

मैं उपयोग कर रहा हूँ सीवन JTA के साथ लेनदेन में कामयाब रहे। मुझे कस्टम एपीआई का उपयोग करने के लिए भी मजबूर किया गया है और मुझे स्रोत कोड बदलने की अनुमति नहीं है।

मेरे विकल्प क्या हैं? मैं "एपीआई" हाइबरनेट सत्र से सीम प्रबंधित लेनदेन को अलग कैसे कर सकता हूं? किसी प्रबंधित डेटा स्रोत से कनेक्शन को कॉन्फ़िगर करना संभव है ताकि प्रबंधित ट्रक्स न हो?

उत्तर

2

आप शायद JTA, जो लेन-देन प्रबंधन के लिए एक जावा ईई मानक है प्रयोग कर रहे हैं। इस मामले में, आप एक प्रबंधित लेनदेन का उपयोग कर रहे हैं। इसका मतलब यह है कि कंटेनर (जेबॉस, ऐसा लगता है) लेनदेन की सीमाओं को संभालने में कामयाब रहा है, और यदि आप कुछ अपवाद फेंकते हैं तो लेनदेन को रोलबैक करने के लिए जेटीए सेमेन्टिक्स का उपयोग करेंगे। इस परिदृश्य में, आप सीधे लेनदेन एपीआई से निपट नहीं पाते हैं। कुछ गलत होने पर आप कुछ अपवाद फेंक देते हैं, और यह लेनदेन के अन्य हिस्सों को वापस खींचने का ख्याल रखेगा।

यही कहा, मैं पुष्टि करते हैं कि इस जार आप प्राप्त JTA एपीआई है आप सलाह देते हैं। यदि ऐसा नहीं है, तो आपको निश्चित रूप से इसके लिए प्रलेखन की आवश्यकता होगी। यदि ऐसा है, तो आप लेनदेन की स्पष्ट सीमा का उपयोग करने के लिए लेनदेन API (और एनोटेशन) का उपयोग कर सकते हैं। (कुछ दस्तावेज यहां उपलब्ध हैं: http://download.oracle.com/javaee/5/tutorial/doc/bnciy.html#bnciz)

कुल मिलाकर, मैं कहूंगा कि कंटेनर आमतौर पर आपके लेनदेन को प्रबंधित करने का एक अच्छा विचार है, क्योंकि एक लेनदेन आम तौर पर एक व्यापार विधि के संदर्भ में होता है, जिसमें दो या दो शामिल हो सकते हैं, अधिक डीएओ कॉल, इस प्रकार, प्रत्येक डीएओ विधि के अंदर आपके लेन-देन से परे मौजूद है।

0

आप 2 लेन-देन लिंक किया जा करना चाहते हैं, यह हाइबरनेट config के साथ गंदगी के लिए इतना है कि लेन-देन उदाहरण है जो आप नियंत्रित है संभव हो सकता है। इसलिए आप अंतर्निहित हाइबरनेट कोड को एक डमी लेनदेन दे सकते हैं जो कुछ भी नहीं करता है और सीम को वास्तविक लेनदेन को नियंत्रित करने देता है।

वैकल्पिक रूप से, यदि आप 2 लेनदेन लिंक नहीं करना चाहते हैं, तो आप शायद एपीबी विधि से एक एजेबी विधि से "समर्थित नहीं" के साथ एपीआई कॉल कर सकते हैं (सीम कैसे काम करता है पर सुपर स्पष्ट नहीं है, लेकिन यह मानते हुए कि यह ejb है हुड)। यह मौजूदा सीम लेनदेन से एपीआई लेनदेन को अलग करेगा।

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