2009-11-19 14 views
20

स्प्रिंग (विशेष रूप से वसंत अनुशंसित दृष्टिकोण: घोषणात्मक लेनदेन) का उपयोग करते समय डेडलॉक या लॉक टाइमआउट अपवादों पर एक लेनदेन को पुनरारंभ करने पर सबसे अच्छा अभ्यास क्या है?वसंत में डेडलॉक/लॉक-टाइमआउट पर लेनदेन को पुनरारंभ कैसे करें?

धन्यवाद,

आसफ

उत्तर

4

क्योंकि यह आवेदन विशेष पर निर्भर करता है वहाँ कोई सार्वभौमिक जवाब है। उदाहरण के लिए आप स्वचालित ट्रांज़ेक्टेड ऑपरेशन को फिर से शुरू करना या ऑपरेशन विफलता के बारे में उपयोगकर्ता को सूचित करना चाहते हैं और स्पष्ट पुनः प्रयास पुष्टिकरण आदि के लिए पूछें

मैं स्वचालित पुनरारंभ परिदृश्य के मामले में एओपी का उपयोग करूंगा।

15

मुझे लगता है कि स्प्रिंग के पास इस प्रश्न का एक अच्छा जवाब होना चाहिए (दस्तावेज़ीकरण के रूप में, कम से कम, या किसी प्रकार का पुनः प्रयास करने वाला)। हां, यह नहीं है।

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

चीजें आप हाइबरनेट उपयोग कर रहे हैं के लिए बाहर देखने के लिए:

  • आपका "इंटरसेप्टर पुन: प्रयास" किसी भी पहले से मौजूद धागा बाध्य हाइबरनेट सत्र निकल कर एक नया rebind करने के लिए सुनिश्चित किया जाना चाहिए। एक बार अपवाद (उदा।, डेडलॉक) को हाइबरनेट/जेडीबीसी कोड के भीतर से फेंक दिया जाता है, संबंधित हाइबरनेट सत्र जहर होता है और उसे त्यागने की आवश्यकता होती है। (session.clear() पर्याप्त नहीं है।)
  • सावधान रहें यदि आपकी लेनदेन सेवा विधियां हाइबरनेट सत्र ऑब्जेक्ट्स को विधि पैरामीटर के रूप में उपयोग करती हैं। पुनः प्रयास करने पर, जब आप अपने हाइबरनेट सत्र को रीसेट करते हैं, तो इन ऑब्जेक्ट्स को अलग किया जाएगा। यदि सेवा विधि मानती है कि वे संलग्न हैं (उदाहरण के लिए, यदि वे आलसी लोड की गई संपत्तियों का उपयोग करते हैं जो सेवा विधि में पहुंचे हैं, या यदि आप उन्हें सहेजने का प्रयास करते हैं, आदि) तो आपको बेहतर करना होगा) सामान्य रूप से, यदि आप बेहतर हैं तो बेहतर होगा लेन-देन सेवा विधियों के पैरामीटर के रूप में हाइबरनेट ऑब्जेक्ट्स का उपयोग न करें।
  • आप MethodInterceptor.invoke() लागू कर रहे होंगे - MethodInvocation उदाहरण जो इसमें पारित हो जाता है वह राज्यपूर्ण हो सकता है; आपको इंटरसेप्टर में इसका उपयोग करने से पहले इसे क्लोन करने की आवश्यकता हो सकती है।
7

मैं वसंत पुन: प्रयास करें project, this तरह कॉन्फ़िगर किया गया से वर्ग org.springframework.retry.interceptor.RetryOperationsInterceptor उपयोग करने की अनुशंसा:

<aop:config> 
    <aop:pointcut id="transactional" expression="execution(* com...*Service.remoteCall(..))" /> 
    <aop:advisor pointcut-ref="transactional" advice-ref="retryAdvice" order="-1"/> 
</aop:config> 

<bean id="retryAdvice" class="org.springframework.retry.interceptor.RetryOperationsInterceptor"/> 

लेकिन अगर आप अभी भी अपने आप से इसे लागू करना चाहते हैं, example of AOP from spring documentation एक अच्छी शुरुआत है।

+2

वसंत पुन: प्रयास परियोजना उल्लेख के लिए धन्यवाद। –

4

मैं कई साल पहले एक ही सवाल था और एक AOP पहलू है, जो अपने कोड में इस तरह लग रही समाप्त होता है के रूप में my own solution लेखन समाप्त हो गया:

@RetryTransaction 
    @Transactional 
    public void doSomething() { 
     .... 
    } 
+0

लिंक मर चुका है। –

+0

धन्यवाद, लिंक अपडेट किया गया। – Archie

+0

ओह वाह। बहुत बहुत धन्यवाद। मैं निश्चित रूप से इसे देख लूँगा। –

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