मेरा प्रोजेक्ट वसंत लेनदेन प्रबंधक के साथ हाइबरनेट का उपयोग कर रहा है और मेरा डेटाबेस पोस्टग्रेज़ (अप्रासंगिक हो सकता है)।डेटाबेस बाधा को हाइबरनेट
मैं बड़ी एक्सएमएल फाइलें पढ़ने और उन वस्तुओं में से वस्तुओं का निर्माण करने की कोशिश कर रहा हूं (वस्तुएं बड़ी नहीं हैं लेकिन राशि है) और उन्हें डेटाबेस में डालें।
यदि किसी मौके से मेरी ऑब्जेक्ट्स में से एक डेटाबेस बाधा का उल्लंघन करती है तो पूरी प्रक्रिया बंद हो जाती है। मैं डेटाबेस बाधा का उल्लंघन करने वाले लोगों को कैसे छोड़ सकता हूं? वैकल्पिक रूप से अपनी आईडी या लॉग फ़ाइल के लिए जो कुछ भी लॉग इन करें?
प्रश्न अद्यतन:
मैं इतना गर्त ब्राउज़ कर दिया गया है और पाया है कि बैच आवेषण के लिए यह सबसे अच्छा स्टेटलेस सत्र का उपयोग करने की सिफारिश की है, लेकिन मैं अभी भी एक ही मुद्दे और डालने मिल बंद हो जाता है:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
यहाँ XML पार्सिंग और डाटाबेस में डालने के लिए अपने कोड के प्रासंगिक भागों रहे हैं, सादगी के लिए चलो मान मैं डालने फिल्में कर रहा हूँ:
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
मैं और यह संपत्ति ऐप-सीटीएक्स hibernate.jdbc.batch_size
से 100 में सेट की है। क्या इससे बचने के लिए डालने से पहले चयन करना वास्तव में आवश्यक है?
अद्यतन 2:
अगर मैं सत्र के बजाय StatelessSession
उपयोग करते हैं, मैं arround 20 आवेषण हो और प्रसंस्करण बंद हो जाता है अनिश्चित काल के लिए किसी भी अपवाद या कुछ भी बिना से।
मुझे लगता है कि नंबर 20 है क्योंकि मैं टोमकैट के साथ कनेक्शन पूल कर रहा हूं और maxActive="20"
है।
बाउंटी अद्यतन:
मैं वास्तव में कोई प्रस्ताव समाधान (यदि संभव हो तो बचाव की मुद्रा में चयन के बिना) को देखने के लिए अच्छा लगेगा। StatelessSession या बस सत्र का उपयोग करना। इस तरह यदि एक स्तंभ नल है या एक अधिकतम चौड़ाई है के रूप में बाधाओं के
एक साधारण कोशिश पकड़ बयान से काम नहीं चलेगा:
मेरे कोड कुछ इस तरह देखा। एक बार अपरिवर्तित द्वारा हाइबरनेट द्वारा फेंक दिया जाता है, सत्र स्थिति असंगत होती है, लेनदेन वापस लुढ़का जाना चाहिए, और सत्र बंद हो गया। इसके अलावा, अपवाद केवल फ्लश समय पर फेंक दिया जाएगा, दोषपूर्ण रिकॉर्ड जारी रखा गया है। –
इसीलिए इस तरह के मामलों के लिए एक स्टेटलेस हाइबरनेट सत्र का उपयोग करने की सिफारिश की जाती है। यह असंगत स्थिति को रोक देगा और स्मृति खपत को भी कम करेगा (या आपको पहले से ही इलाज की गई संस्थाओं को बेदखल नहीं करना पड़ेगा) –