2012-07-02 13 views
15

मैं अपने प्रोग्राम को निष्पादित करते समय एक जेडीबीसी बैच डालने (लगभग एक समय में 1000 पंक्तियां डालने) कर रहा हूं। लेकिन मैं कुछ रिकॉर्ड्स द्वारा ठीक से फेंक दिया अपवाद को संभालने में सक्षम नहीं हूं।जेडीबीसी बैच सम्मिलित हैंडलिंग

मान लीजिए, 1000 रिकॉर्ड्स में से 100 वां रिकॉर्ड अपवाद फेंक रहा है क्योंकि किसी अमान्य डेटा या कुछ मान के आकार कॉलम आकार से अधिक है। एक बार अपवाद हो जाने के बाद, शेष रिकॉर्ड डाला नहीं जा रहा है और प्रोग्राम बीच में विफल रहता है।

जो भी मैं चाहता हूं वह है कि 100 वें रिकॉर्ड अपवाद फेंक रहा है, शेष कार्यक्रम मेरे कार्यक्रम समाप्त होने से पहले सामान्य रूप से होना चाहिए।

मुझे यह समझने में सक्षम नहीं है कि इसे कैसे प्राप्त किया जाए। कृपया सुझाव दे।

संपादित करें:

यहाँ बैच डालने के लिए एक नमूना कोड मैं अपने अनुप्रयोग में उपयोग कर रहा हूँ है। मान लें कि परिणाम सेट में लगभग 1000 रिकॉर्ड हैं।

PreparedStatement ps = null; 
while(rs.next()){ 
    //Retrieve the value and set it to a Prepared statement 

    String name = rs.getString("Name"); 
    int age = rs.getInt("Age"); 
    ps.setInt(1, age); 
    ps.setString(2, name); 

    //Finally invoke addBatch 
    ps.addBatch(); 
} 

//Finally call the executeBatch method 
ps.executeBatch(); 

100 वीं रिकॉर्ड एक अपवाद फेंक रहा है, तो मैं केवल 100 वां भी 1000 रिकॉर्ड से प्रक्रिया को गति प्रदान करना चाहते हैं। ऐसा करने का कोई तरीका है कि मैं रिकॉर्ड से प्रक्रिया को पुनरारंभ कर सकता हूं जिसने अपवाद आगे को फिर से अंत तक फेंक दिया? इसे कैसे प्राप्त करें?

+2

और आपका कोड है? – Alfabravo

उत्तर

0

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

मुझे लगता है कि सम्मिलित करने से पहले रिकॉर्ड को पूर्व-सत्यापित करने का एक और साफ दृष्टिकोण होगा। यदि हम एक समय में केवल 1000 रिकॉर्ड ही बात कर रहे हैं तो यह प्रसंस्करण भार के अधिक नहीं होना चाहिए।

+0

मेरी मूल पोस्ट पर कोई सुझाव/सहायता? – user182944

25

आप बताते हैं कि आप SQL कथन के बैच निष्पादित कर रहे हैं, इसलिए मुझे लगता है कि आप executeBatch का उपयोग कर रहे हैं। जब आप executeBatch बयानों का एक बैच, कुछ कथन सफल हो सकते हैं और कुछ कथन विफल हो सकते हैं। यदि एक कथन विफल रहता है, तो इसका मतलब यह नहीं है कि जेडीबीसी चालक सफल होने वाले बयान वापस लेता है। जेडीबीसी चालक बैच में सभी बयानों को निष्पादित करने का प्रयास कर सकता है यदि कोई कथन विफल हो जाता है या बयान में विफल होने के बाद बैच में निष्पादन रोकना बंद करना चुन सकता है (ऐसा लगता है कि आप जिस चालक का उपयोग कर रहे हैं, वह कथन निष्पादित करना बंद करने के लिए चुनता है जैसे ही विफलता होती है)।

जब बैच में एक कथन विफल हो जाता है, तो आपको BatchUpdateException प्राप्त करना चाहिए। आपके अपवाद हैंडलर में, आपको getUpdateCounts पर कॉल करने की आवश्यकता है। इससे आपको int की एक सरणी मिल जाएगी जो आपको बताती है कि कथन कितनी पंक्तियों को अपडेट किया गया है, Statement.SUCCESS_NO_INFO बयान जारी करने का संकेत देता है लेकिन कोई पंक्ति गणना उपलब्ध नहीं थी, या Statement.EXECUTE_FAILED इंगित करता है कि कथन विफल हुआ। यदि पहले 99 कथन सफल होते हैं, तो 100 वां कथन एक त्रुटि उत्पन्न करता है, और शेष बयानों को निष्पादित नहीं किया जाता है, आपको 100 तत्व सरणी वापस लेनी चाहिए जहां पहले 99 तत्व सफलता का संकेत देते हैं और 100 वां तत्व Statement.EXECUTE_FAILED इंगित करता है। तब आपके कोड को उन बयानों को पुनः प्रयास करने की आवश्यकता होगी जिन्हें निष्पादित नहीं किया गया था (इस मामले में, 101-1000 बयान)।

+0

मेरी मूल पोस्ट पर कोई सुझाव/सहायता? – user182944

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