मेरे पास एक ऐसा एप्लिकेशन है जिसे एकाधिक डेटाबेस से कनेक्ट करने की आवश्यकता है। यह एक प्रशासनिक अनुप्रयोग है जिसका मूल रूप से विभिन्न डेटाबेस में प्रविष्टियों का प्रबंधन करने के लिए उपयोग किया जाता है - हमें एक साथ कई डेटाबेस तक पहुंचने की आवश्यकता नहीं है और न ही हमें किसी प्रकार के वितरित लेनदेन प्रबंधन की आवश्यकता है।विभिन्न डेटा स्रोतों के लिए वसंत में लेनदेन स्थापित करने का सही तरीका?
मूल रूप से आवेदन में से एक क्षेत्र में आप डाटाबेस एक में गैजेट बनाने की सुविधा देता है, और आवेदन के एक अन्य क्षेत्र आप डाटाबेस बी में इसी तरह के उपकरणों के लिए कॉन्फ़िगर करें
हम पहले से ही लेन-देन की स्थापना की और पूरी तरह से काम कर रहा है जब सिर्फ एक का उपयोग कर देता है डेटा स्रोत। विन्यास तो दिखाई देता है:
<aop:config>
<aop:pointcut id="companyServicePoint"
expression="execution(* com.company.service.CompanyService.*(..))" />
<aop:advisor advice-ref="companyServiceTxAdvice"
pointcut-ref="companyServicePoint"/>
</aop:config>
<tx:advice id="companyServiceTxAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- set propogation required on create methods, all others are read-only -->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
यह CompanyService
के भीतर किसी भी किसी भी विधि का निष्पादन पर एक pointcut सेट करता है और pointcut जो किसी भी तरीकों जिसका नाम "बनाने" के साथ शुरू होता के लिए लेन-देन की आवश्यकता के साथ लेन-देन सलाह एकत्रित करती है। लेनदेन सलाह एक लेनदेन प्रबंधक से जुड़ा हुआ है जो डेटा स्रोत से जुड़ा हुआ है।
एक दूसरे (या अधिक) डेटा स्रोत जोड़ने के दौरान, मैं अन्य डेटा स्रोतों पर एक ही लेनदेन सलाह कैसे लागू कर सकता हूं? चूंकि एओपी सलाह केवल एक लेनदेन प्रबंधक से जुड़ी हो सकती है, जो केवल एक डेटा स्रोत से जुड़ी हो सकती है, क्या मुझे डुप्लिकेट लेनदेन सलाह स्थापित करने की आवश्यकता है?
मैं सेटअप एक ही pointcut को डुप्लीकेट लेन-देन सलाह, इसका मतलब यह नहीं होगा कि मेरे CompanyService
इंटरफ़ेस में किसी भी विधि का आमंत्रण के खिलाफ propogation की आवश्यकता होगी मेरी datasources के सभी?
मेरा अंतिम प्रश्न थोड़ा स्पष्ट करने के लिए, मेरे पास कई बीन्स घोषित किए जाएंगे जो CompanyService
इंटरफ़ेस को कार्यान्वित करते हैं, और इनमें से प्रत्येक बीन्स के पास अलग-अलग डेटा स्रोत का उपयोग करने के लिए CompanyDAO
अलग होगा। मुझे डर है कि इस दृष्टिकोण का अर्थ यह होगा कि जब companyService1
बीन का आह्वान किया जाता है, तो लेनदेन सलाह all
कंपनी सेवा बीन्स/डेटा स्रोतों पर ट्रिगर की जाएगी।
क्या मैं इस बारे में गलत तरीके से जा रहा हूं?
अद्यतन: मैं वास्तव में विन्यास के बारे में मैं ऊपर (समान pointcut करने के लिए दो सलाहकार संलग्न), और CompanyService
कार्यान्वयन के दोनों व्यक्ति उदाहरण पर किसी भी विधि लागू वास्तव में दोनों पर नए लेनदेन पैदा नहीं करता बात बाहर परीक्षण किया है datasources, अपेक्षा के अनुरूप:
DEBUG company.serviceDataSourceTransactionManager - Creating new transaction with name [com.company.service.CompanyService.createCompany]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
DEBUG company.serviceDataSourceTransactionManager - Acquired Connection [connection1 string here...] for JDBC transaction
...
DEBUG company.serviceDataSourceTransactionManager - Creating new transaction with name [com.company.service.CompanyService.createCompany]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
DEBUG company.serviceDataSourceTransactionManager - Acquired Connection [connection2 string here...] for JDBC transaction
...
DEBUG company.serviceDataSourceTransactionManager - Rolling back JDBC transaction on Connection [connection1 string here...]
...
DEBUG company.serviceDataSourceTransactionManager - Rolling back JDBC transaction on Connection [connection2 string here...]
यह लगता है जैसे कि यह, सड़क के नीचे समस्याओं का कारण के बाद से या तो CompanyService
उदाहरण ही कभी एक भी डेटा स्रोत के साथ काम कर रहा है होगा।
क्या मैं इसे पूरा करने की कोशिश करने के लिए एक बेहतर तरीका है?
धन्यवाद, यह अच्छी तरह से काम करता है - या तो बीन इंस्टेंस लागू होने पर केवल एक ही लेनदेन बनाया जाता है। इंटरफ़ेस पर पॉइंटकट घोषित करने के रूप में समाधान के सुरुचिपूर्ण के रूप में नहीं, लेकिन यही मेरा उपयोग केस कॉल करता है ... –