2009-06-21 16 views
9

मैं जावा ऐप पर काम कर रहा हूं जो वसंत IoC और जेडीबीसी टेम्पलेट कक्षाओं का उपयोग करता है। मेरे पास एक डीएओ कक्षा है जिसमें 4 विधियां हैं: एम 1() से एम 4()।वसंत जेडीबीसी का उपयोग कर आसान लेनदेन?

while(true) 
{ 
    //process & generate data 

    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 

    //sleep 
} 

मैं लगातार 4 पद्धति के तहत db संचालन हैं: इस प्रकार एम 1 टेबल t1, टेबल t2 पर एम 2, T3 पर एम 3, आदि पर अनेक निवेशन और अद्यतन

डीएओ तरीकों का इस्तेमाल किया जाता है करता है परमाणु होने के लिए कॉल, या तो सभी 4 टेबल सफलतापूर्वक अपडेट किए गए हैं या कोई नहीं हैं। इसलिए, यदि m3() में संचालन करते समय कोई त्रुटि हुई है, तो मैं m2 & m1 में किए गए सभी परिवर्तनों को अपडेट करना चाहता हूं (अपडेट & आवेषण)।

तो क्या वसंत आपको निम्न तरीके से करने देता है?

while (true) 
{ 
    //process & generate data 

    transaction = TransactionManager.createNewTransaction(); 

    transaction.start() 

    try 
    { 
    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 
    } 
    catch(DbUpdateException e) 
    { 
    transaction.rollBack(); 
    } 

    transaction.end(); 

    // sleep 

}

या वहाँ बेहतर तरीके यह करने के लिए कर रहे हैं?

उत्तर

8

पूर्णता के लिए, कार्यक्रम संबंधी समाधान होगा:

private TransactionTemplate transactionTemplate; 

public setTransactionManager(PlatformTransactionManager transactionManager) { 
    this.transactionTemplate = new TransactionTemplate(transactionManager); 
} 

... 

while (true) { 

    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
    protected void doInTransactionWithoutResult(TransactionStatus status) { 
     try { 
     dao.m1(data1); 
     dao.m2(data2); 
     dao.m3(data3); 
     dao.m4(data4); 
     } catch(DbUpdateException e) { 
     status.setRollbackOnly(); 
     } 
    } 
    }); 
} 
1

हां, आप उन कॉल को विधि के अंदर डाल सकते हैं और अपने लेनदेन declaratively निर्दिष्ट कर सकते हैं।

आपको उस कोड को जोड़ने की आवश्यकता नहीं है - वसंत आपके लिए यह कर सकता है।

15

हाँ वसंत आपको programmatically control transactions पर अनुमति देता है।

व्यक्तिगत तौर पर मैं declarative transactions एनोटेशन का उपयोग पसंद करते हैं, जो इस प्रकार है:

public void runBatchJob() { 
    while (true) { 
    // generate work 
    doWork(unitOfWork); 
    } 
} 

@Transactional 
private void doWork(UnitOfWork work) { 
    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 
} 

जहां डीएओ कार्यों परिभाषित कर रहे हैं:

@Transactional 
public void m1(Data data) { 
    ... 
} 

यह आपके applicationContext.xml में की आवश्यकता है:

<tx:annotation-driven/> 

Declarat लेनदेन की आवश्यकता के लिए ive लेनदेन घोषित किया जा सकता है, एक नया लेनदेन, समर्थन लेनदेन आदि की आवश्यकता होती है। रोलबैक तब होगा जब @Transactional के साथ एनोटेटेड ब्लॉक RuntimeException फेंकता है।

+0

देखें मैं तुम्हें एम 1, एम 2, @Transactional के रूप में आदि टिप्पणी करने की जरूरत है विश्वास नहीं है। यदि कोई अपवाद फेंकता है, तो डू वर्क द्वारा पहले से पूरा किया गया सब कुछ वापस लुढ़का जाएगा। – Chadwick

+0

आपको इस संदर्भ में, आवश्यकता नहीं है। लेकिन अगर वे अपडेट कर रहे हैं, तो आपको लेन-देन की आवश्यकता के रूप में उन्हें एनोटेट करना चाहिए, अन्यथा यदि आप उन्हें doWork() संदर्भ से बाहर कॉल करते हैं तो आप स्वयं को गैर-लेनदेन अपडेट कर सकते हैं। – cletus

+0

क्या @ निजीकरण विधि पर लागू होने पर @ ट्रांसेक्शनल एनोटेशन कुछ भी करता है? –

1

स्प्रिंग @Transactional का उपयोग कर के रूप में समझाया या XML में यदि आप चाहें तो द्वारा सभी आप के लिए इस संभाल कर सकते हैं।

सही होने के लिए आयात की बात का प्रकार है लेनदेन प्रचार आप चाहते हैं कि सभी आपके आवेदन पर निर्भर करते हैं।

डिफ़ॉल्ट रूप से कोई लेनदेन शुरू हो जाएगा यदि कोई अस्तित्व में नहीं है, और यदि कोई पहले ही शुरू हो चुका है तो मौजूदा लेनदेन का पुन: उपयोग करेगा। यह वह व्यवहार है जिसे आप चाहते हैं यदि आप सभी 4 डीएओ परमाणु होना चाहते हैं।

एक कक्षा पर @ ट्रांसेक्शनल डालें जो डीएओ विधियों को प्रबंधित करेगा (MyService) - इस परत के नीचे कुछ भी अब उस लेनदेन सीमा में हिस्सा लेगा।

i।ई:

@Transactional 
public void m1(Data data) { 
... 
} 

@Transactional 
public void m2(Data data) { 
... 
} 

कोड में यह करना पूरी तरह से अनावश्यक है।

here for more info

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