2008-09-16 20 views
11

मेरे पास एक applicationContext.xml फ़ाइल है, और इसमें दो org.springframework.orm.jpa.JpaTransactionManager (प्रत्येक अपनी स्वयं की दृढ़ता इकाई, विभिन्न डेटाबेस के साथ) स्प्रिंग मिडलवेयर कस्टम एप्लिकेशन में कॉन्फ़िगर किया गया है।

मैं, (@Transactional) एनोटेशन आधारित लेनदेन का उपयोग करना चाहते नहीं गड़बड़ TransactionStatus के साथ चारों ओर प्रतिबद्ध, बचाने के लिए, और रोलबैक करने के लिए।

एक सहकर्मी उल्लेख किया है कि कुछ ऐसा करने भ्रमित हो जाता है जब एक से अधिक लेन-देन प्रबंधकों हैं, भले ही प्रसंग फ़ाइल सेट किया गया है सही ढंग से कॉन्फ़िगर (संदर्भ सही हठ इकाई में जाते हैं। किसी को कभी कोई समस्या दिखाई देती?जेपीए एकाधिक लेनदेन प्रबंधक


अपने config में, आप दो लेन-देन के प्रबंधकों के लिए होता है? आप txManager1 और txManager2 है?

है यही कारण है कि मैं जेपीए के साथ किया है, दो अलग अलग स्प्रिंग सेम है कि लेनदेन प्रबंधक हैं।

उत्तर

9

मुझे लगता है कि आपके पास 2 विकल्प हैं

यदि आपके उपयोग-मामलों को एक ही लेनदेन के भीतर दोनों डेटाबेसों के अपडेट की आवश्यकता नहीं होती है, तो आप दो JpaTransactionManagers का उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि आप @Transactional दृष्टिकोण का उपयोग करने में सक्षम होंगे ? इस मामले में, आप लेन-देन सीमाओं, जैसे परिभाषित करने के लिए एक सरल TransactionProxyFactoryBean का उपयोग कर के पुराने तंत्र पर वापस आने की आवश्यकता होगी:

<bean id="firstRealService" class="com.acme.FirstServiceImpl"/> 
<bean id="firstService" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager" ref="firstJpaTm"/> 
    <property name="target" ref="firstRealService"/> 
    <property name="transactionAttributes"> 
     <props> 
      <prop key="insert*">PROPAGATION_REQUIRED</prop> 
      <prop key="update*">PROPAGATION_REQUIRED</prop> 
      <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> 
     </props> 
    </property> 
</bean> 
<!-- similar for your second service --> 

तुम दोनों डेटाबेस में फैले एक सौदे की आवश्यकता होती है, तो आप एक JTA का उपयोग करने की आवश्यकता होगी लेन-देन प्रबंधक। API कहता है:

यह लेनदेन प्रबंधक अनुप्रयोग जो लेन-देन संबंधी डेटा का उपयोग के लिए एक एकल जेपीए EntityManagerFactory का उपयोग के लिए उपयुक्त है। JTA (आमतौर पर JtaTransactionManager के माध्यम से) एक ही लेन-देन के भीतर कई लेन-देन संबंधी संसाधनों तक पहुँचने के लिए आवश्यक है। ध्यान रहे कि यह JTA लेनदेन में भाग बनाने के लिए उसके अनुसार अपनी जेपीए प्रदाता विन्यस्त करने की जरूरत।

इसका क्या अर्थ है कि आपको जेटीए लेनदेन प्रबंधक प्रदान करने की आवश्यकता होगी। हमारे आवेदन में, हम निम्न के समान config का उपयोग करें:

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManagerName" value="appserver/jndi/path" /> 
</bean> 

आप एक appserver भीतर तैनाती रहे हैं, तो वसंत JtaTransactionManager appserver द्वारा प्रदान की वास्तविक XA-संगत JTA लेनदेन प्रबंधक को एक देखने के लिए जरुरी है। हालांकि, आप एक स्टैंडअलोन जेटीए लेनदेन प्रबंधक का भी उपयोग कर सकते हैं (लेकिन मैंने अभी तक यह कोशिश नहीं की है)

जेपीए दृढ़ता प्रदाता को कॉन्फ़िगर करने के लिए, मैं परिचित नहीं हूं। आप क्या जेपीए हठ प्रदाता का उपयोग कर रहे हैं?

उपरोक्त कोड हमारे दृष्टिकोण पर आधारित है, जहां हम हाइबरनेट के जेपीए कार्यान्वयन के विरोध में देशी हाइबरनेट का उपयोग कर रहे थे। एनोटेशन संचालित तत्व: इस मामले में, हम दो HibernateTransactionManager सेम से छुटकारा पाने के, और बस यह सुनिश्चित करें कि दोनों SessionFactories ही JTA टीएम इंजेक्शन थे, और फिर tx का उपयोग सक्षम थे।

आशा इस मदद करता है

+0

क्या आप एकाधिक डेटाबेस के साथ नमूना कोड या पीटीसी jtaTransaction प्रदान कर सकते हैं? – dhroove

+0

[एटमिकोस उदाहरण के साथ टोमकैट में वसंत जेटीए एकाधिक संसाधन लेनदेन] (http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.html) – anasanjaria

3

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

आंतरिक रूप से वसंत के लेनदेन प्रबंधक सभी वसंत के लेनदेन सिंक्रनाइज़ेशन प्रबंधक का उपयोग करते हैं जो स्थैतिक थ्रेडलोकल चर में महत्वपूर्ण स्थिति का एक गुच्छा रखता है, इसलिए लेनदेन प्रबंधकों को एक-दूसरे के राज्य में घूमने की गारंटी दी जाती है।