2009-09-24 13 views
10

मेरे पास एक ऐसा एप्लिकेशन है जिसे एकाधिक डेटाबेस से कनेक्ट करने की आवश्यकता है। यह एक प्रशासनिक अनुप्रयोग है जिसका मूल रूप से विभिन्न डेटाबेस में प्रविष्टियों का प्रबंधन करने के लिए उपयोग किया जाता है - हमें एक साथ कई डेटाबेस तक पहुंचने की आवश्यकता नहीं है और न ही हमें किसी प्रकार के वितरित लेनदेन प्रबंधन की आवश्यकता है।विभिन्न डेटा स्रोतों के लिए वसंत में लेनदेन स्थापित करने का सही तरीका?

मूल रूप से आवेदन में से एक क्षेत्र में आप डाटाबेस एक में गैजेट बनाने की सुविधा देता है, और आवेदन के एक अन्य क्षेत्र आप डाटाबेस बी में इसी तरह के उपकरणों के लिए कॉन्फ़िगर करें

हम पहले से ही लेन-देन की स्थापना की और पूरी तरह से काम कर रहा है जब सिर्फ एक का उपयोग कर देता है डेटा स्रोत। विन्यास तो दिखाई देता है:

<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 उदाहरण ही कभी एक भी डेटा स्रोत के साथ काम कर रहा है होगा।

क्या मैं इसे पूरा करने की कोशिश करने के लिए एक बेहतर तरीका है?

उत्तर

3

हाँ, यदि कोई डुप्लीकेट लेन-देन सलाह की जरूरत है। निम्न कॉन्फ़िगरेशन में नोटिस करें कि पॉइंटकट अभिव्यक्ति एक विशिष्ट कंपनी सेवा सेवा बीन का चयन करती है।

<bean id="companyService1" class="com.company.service.CompanyServiceImpl"> 
    <property name="companyDao"> 
    <bean class="com.company.service.CompanyDAO"> 
     <property name="dataSource" ref="dataSource1"/> 
    </bean> 
    </property> 
</bean> 

<aop:config> 
    <aop:pointcut 
     id="companyServicePoint1" 
     expression="bean(companyService1)"/> 
    <aop:advisor 
     advice-ref="companyServiceTxAdvice1" 
     pointcut-ref="companyServicePoint1"/> 
</aop:config> 

<tx:advice id="companyServiceTxAdvice1" transaction-manager="txManager1"> 
    <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="txManager1" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource1"/> 
</bean> 

किसी अन्य कंपनी सेवा बीन को कॉन्फ़िगर करने के लिए, आपको उसी वर्बोज बॉयलरप्लेट को डुप्लिकेट करने की आवश्यकता है।वसंत में लेनदेन की सीमा का एक और तरीका TransactionProxyFactoryBean का उपयोग करता है। यह मामूली कम वर्बोज़ है क्योंकि यह बाल बीन्स द्वारा विरासत में प्राप्त सामान्य गुणों को कॉन्फ़िगर करने के लिए माता-पिता बीन परिभाषा का उपयोग करता है।

<bean 
    id="baseTransactionProxy" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
    abstract="true"> 
    <property name="transactionAttributes"> 
    <props> 
     <prop key="create*">PROPAGATION_REQUIRED</prop> 
     <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> 
    </props> 
    </property> 
</bean> 

<bean id="companyService1" parent="baseTransactionProxy"> 
    <property name="transactionManager" ref="txManager1"/> 
    <property name="target"> 
    <bean class="com.company.service.CompanyServiceImpl"> 
     <property name="companyDao"> 
     <bean class="com.company.service.CompanyDAO"> 
      <property name="dataSource" ref="dataSource1"/> 
     </bean> 
     </property> 
    </bean> 
    </property> 
</bean> 

<bean 
    id="txManager1" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource1"/> 
</bean> 
+0

धन्यवाद, यह अच्छी तरह से काम करता है - या तो बीन इंस्टेंस लागू होने पर केवल एक ही लेनदेन बनाया जाता है। इंटरफ़ेस पर पॉइंटकट घोषित करने के रूप में समाधान के सुरुचिपूर्ण के रूप में नहीं, लेकिन यही मेरा उपयोग केस कॉल करता है ... –

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

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