2010-01-26 17 views
5

मैंने निम्नलिखित व्यवहार देखा है।जावा जेडीबीसी साफ़बैच() और ढेर मेमोरी

मेरे पास एक फ़ाइल है जिसमें लगभग 3 एमबी कई हजार पंक्तियां हैं। पंक्तियों में मैं विभाजित और तैयार कथन (लगभग 250 000 बयान) बनाते हैं।

मैं क्या है:

preparedStatement 
addBatch 
do for every 200 rows { 
executeBatch 
clearBatch(). 
} 
अंत

commit() 

स्मृति उपयोग स्मृति त्रुटि से बाहर के बिना 70MB के आसपास की वृद्धि होगी पर

। क्या यह स्मृति उपयोग को कम कर सकता है? और लेनदेन व्यवहार है (यदि कोई विफल रहता है तो विफल रहता है।)। मैं executeBatch और clearBatch के साथ प्रतिबद्ध करके स्मृति को कम करने में सक्षम था ... लेकिन इससे कुल सेट का आंशिक सम्मिलन होगा।

+1

यह JDBC ड्राइवर की गुणवत्ता पर बहुत निर्भर हो सकता है - जो एक हैं आप उपयोग कर रहे हैं? – skaffman

+0

मैं 200 पंक्तियों से 10000 में बदल गया हूं और निष्पादित करने का समय अब ​​37 सेकंड है। ऐसा लगता है कि एक ही आकार का उपयोग किया जाता है। मैं H2 के org.h2.jdbcx.JdbcConnectionPool का उपयोग कर रहा हूं डेटा को फ़ाइल के रूप में संग्रहीत किया जाता है .. स्मृति में नहीं। मैं डेटाबेस सर्वर जैसे ओरेकल, माइस्क्ल, आदि के बिना स्थानीय एप्लिकेशन बनाने की कोशिश कर रहा हूं – Firone

+0

क्या आप निश्चित हैं कि उच्च मेमोरी उपयोग डेटाबेस प्रसंस्करण से संबंधित है, न कि आयात से फ़ाइल I/O पर? – Timothy

उत्तर

2

आप सभी पंक्तियों को उसी संरचना के साथ एक अस्थायी तालिका में सम्मिलित कर सकते हैं और यदि सबकुछ ठीक है। डाटाबेस को इन्हें लक्ष्य तालिका में डालने दें: insert into target (select * from temp)। यदि अस्थायी तालिका में आयात विफल रहता है तो आपने लक्ष्य तालिका में कुछ भी नहीं बदला है।

संपादित करें: तय वाक्य रचना

-1

तुम भी JDBC 2.0 "बैच प्रोसेसिंग" सुविधा का उपयोग कर सकते हैं। statement.executeBatch()

  • connection.commit()
  • पकड़ने अपवाद और रोलबैक का उपयोग कर इसे प्रतिबद्ध:

    1. अपने dbconnection का उपयोग कर connection.setAutoCommit(false)
    2. , अपने बयान statement.addBatch(sql_text_here)
    3. का उपयोग करने के बैचों जोड़े एक बार आपके बैचों सभी लोड किए गए हैं का उपयोग कर इसे निष्पादित सेट connection.rollback()
    का उपयोग कर आवश्यकतानुसार

    catch(BatchUpdateException bue) 
        { 
        bError = true; 
        aiupdateCounts = bue.getUpdateCounts(); 
    
        SQLException SQLe = bue; 
        while(SQLe != null) 
        { 
         // do exception stuff 
    
         SQLe = SQLe.getNextException(); 
        } 
        } // end BatchUpdateException catch 
        catch(SQLException SQLe) 
        { 
        ... 
    
        } // end SQLException catch 
    

    यहाँ पढ़ें:: 10

    अपवाद रोलबैक के लिए से निपटने के बारे में अधिक ... यहाँ एक ठेठ रोलबैक अपवाद संचालक है http://java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

  • +2

    क्या वह वर्णन नहीं करता है कि वह वर्तमान में तैयार वक्तव्यों को छोड़कर छोड़ देता है? – Anonym

    +0

    आंशिक रूप से, हां (चरण 1-4)। लेकिन अगर चरण विफल रहता है तो चरण 5 लेनदेन के पूर्ण रोलबैक की अनुमति देगा। – Timothy

    +0

    रोलबैक समस्या से प्रासंगिक नहीं है। – skaffman

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