2016-04-20 9 views
5

का उपयोग कर हाइबरनेट बैच अपडेट मैं अपने ओआरएम परत के लिए हाइबरनेट का उपयोग कर रहा हूं। मैं एक लेनदेन में एचक्यूएल प्रश्नों के बैच को चलाने की कोशिश कर रहा हूं (मैं session.update का उपयोग नहीं कर सकता)। मुद्दा यह है कि लेनदेन.com() भी लूप के अंत में है, अद्यतन क्वेरी एक-एक करके चलती हैं। क्या एक लेनदेन में एकाधिक एचक्यूएल प्रश्न चलाने का कोई तरीका है?एचक्यूएल क्वेरी

public void updateItems() { 
    t = session.beginTransaction(); 
    for (int i = 0; i < itemList.size(); i++) { 
     Query q = createUpdateQuery(session, itemList.get(i));  
     q.executeUpdate(); //updating one by one, and not waiting for transaction commit 
    } 
    t.commit(); 
} 



Query createUpdateQuery(Session session, Item item) { 
    Query q = session.createQuery(
       "Update Item i set i.notes=:notes, i.time=:time, i.counter=:counter, i.status=:status Where i.id=:id and i.time=:time"); 

    q.setParameter("time", item.getTime()); 
    q.setParameter("status", item.getStatus()); 
    q.setParameter("notes", item.getNotes()); 
    q.setParameter("id", item.getId()); 
    return q; 
} 

किसी भी मदद की सराहना करें।

+0

मुझे आपके कोड के साथ स्पष्ट रूप से कुछ भी गलत नहीं दिख रहा है। अपडेट डेटाबेस पर एक-एक करके होंगे, लेकिन जब तक आप कॉल को कॉल नहीं करेंगे तब तक प्रतिबद्ध नहीं होंगे। कॉल करने से पहले आपको लेनदेन को किसी भी समय रोलबैक करने में सक्षम होना चाहिए। यह बहुत मानक है। क्या आप डेटाबेस के लिए राउंड ट्रिप के बारे में चिंतित हैं? – markwatsonatx

+0

एक लेनदेन होने का मतलब बड़े बड़े बैच में कई अपडेट भेजना नहीं है। और वहां बहुत सी चीजें हैं जो आपके दृष्टिकोण में सही नहीं दिख रही हैं (मेरी इच्छा है कि आप उत्पादन कोड में क्या करने जा रहे हैं)। –

+0

आपके उत्तर के लिए धन्यवाद। मुझे session.update (आइटम) से इस दृष्टिकोण में बदलने की जरूरत है, और प्रदर्शन में कमी आई है। – Lasti

उत्तर

2

आप अपने सभी कथनों को नामांकित करने के लिए डेटाबेस लेनदेन का उपयोग कर रहे हैं, लेकिन मुझे लगता है कि आप batch updates का उपयोग करना चाहते हैं।

<property name="hibernate.jdbc.batch_size" value="10"/> 

फिर भी, मुझे लगता है कि आप, हाइबरनेट का उपयोग करना चाहिए बयानों सम्मिलित/अपडेट करने का प्रबंधन/हटाने के लिए के रूप में आप केवल entity state transitions पर ध्यान देना चाहिए:

बस निम्नलिखित विन्यास संपत्ति जोड़ें। dirty checking mechanism स्वचालित रूप से संशोधित इकाइयों का पता लगा सकता है, और हाइबरनेट आपके लिए अद्यतन कथन उत्पन्न कर सकता है, जो अधिक सुविधाजनक है।

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