2012-08-31 13 views
6

मैंने SQL डेवलपर के साथ BLOB डेटा डालने का प्रयास किया है। लेकिन मुझे सम्मिलित बयान नहीं मिल रहे हैं जो वास्तव में बीएलओबी डेटा डालने के लिए उपयोग किए जाते हैं।एसक्यूएल का उपयोग करते हुए ओरेकल डेटाबेस से बीएलओबी डेटा डालने और पुनर्प्राप्त करने के तरीके क्या हैं?

इसके अलावा, डेटाबेस की गति वास्तव में धीमी है। छोटी फाइलों के लिए, यह ठीक निष्पादित करता है। लेकिन जब मैंने बीएलओबी में 50 एमबी एवी फाइल आयात करने की कोशिश की, तो इसमें 3-4 मिनट & लिया गया, फिर भी यह पूरा नहीं हुआ था। जब मैंने किसी फ़ाइल में BLOB डेटा निर्यात करने का प्रयास किया, तो निर्यात प्रक्रिया भी धीमी थी। मैं ओरेकल 10 जी एक्सप्रेस संस्करण का उपयोग कर रहा था। यदि डेटाबेस की गति फ़ाइल-सिस्टम की गति से भी धीमी है, तो डेटाबेस का उपयोग बीएलओबी डेटा को संग्रहीत करने के लिए क्यों किया जाता है? क्या प्रदर्शन को अनुकूलित करने का कोई और तरीका है?

+0

मैं कभी नहीं Blobs का उपयोग कर फ़ाइलों को स्टोर करने की सलाह देते हैं - सिर्फ उन्हें उन फ़ाइलों को एक फाइल सिस्टम और दुकान संदर्भ पर डाल दिया ... –

+0

मुझे लगता है कि होता है कि 'BLOB's लगभग हमेशा संग्रहीत किया जाएगा फ़ाइल सिस्टम में और डेटा निर्देशिका में एक सूचक 'dba_directories' (मेटाडेटा की तरह) में परिभाषित किया गया है। ओरेकल 'बीओएलबी' को एक टेबल में डालने के लिए अपने 'वेबुटिल' पैकेज में कुछ फ़ंक्शंस प्रदान करता है लेकिन फिर उन उपयोगकर्ताओं के संदर्भ में होगा जो फ़ाइल को अपलोड करने के लिए संदर्भित होंगे ('avi 'कहें) एक एंड एंड एप्लिकेशन के माध्यम से (' ओरेकल फॉर्म 'के आधार पर या 'सर्वोच्च' आदि)। दूसरा तरीका 'dbms_lob.fileopen' और 'dbms_lob.loadfromfile' का उपयोग अपने' BLOB' var को आरंभ करने के लिए करेगा और फिर सम्मिलित करें लेकिन फिर प्रदर्शन यहां एक चिंता है। – Annjawn

+0

@NWest यदि आप फ़ाइल-सिस्टम में बीएलओबी स्टोर करने की सिफारिश कर रहे हैं, तो क्यों हर पेशेवर वेब एप्लिकेशन बैक-एंड सेवा के रूप में मजबूत डेटाबेस का उपयोग करता है? यदि कोई फ़ाइल-सिस्टम में मेरे डेटा का प्रमुख हिस्सा संग्रहीत करता है, तो किसी को भी डेटाबेस की आवश्यकता क्यों होगी? वे सिर्फ एक्सएमएल या एमडीबी फाइल में सूचनाएं स्टोर कर सकते हैं और आवश्यकता होने पर उन्हें पुनर्प्राप्त कर सकते हैं !!!! –

उत्तर

5

सबसे पहले, आप एक डेटाबेस में भंडारण BLOBs (कभी कभी एक सा है, अक्सर काफी) धीमी हो की उम्मीद करनी चाहिए, लेकिन निश्चित रूप से उन्हें एक फाइल सिस्टम में भंडारण की तुलना में तेजी नहीं। कारणों उन्हें एक DB में स्टोर करने के लिए प्रदर्शन के बारे में केंद्र नहीं है, लेकिन जैसे के बारे में:

एक क्लस्टर या लोड संतुलित परिदृश्य
  • बैकअप की आसानी में एक (साझा) फाइल सिस्टम के
    • अनुपलब्धता: एकल प्रक्रिया, AOT 2 प्रक्रियाएं जब फाइलें और डीबी का उपयोग किया जाता है
    • लेनदेन सुरक्षा: एक बीएलओबी या तो वहां है और पूर्ण या नहीं, लेकिन आधे बेक्ड चरण
    • अन्य में मैं अभी इस बारे में नहीं सोच सकता।

    अंगूठे का सामान्य नियम यह है कि यदि इनमें से कोई भी आपको चिंता नहीं करता है, तो आपको अपनी फाइलों को ... फाइलों के रूप में स्टोर करना चाहिए। डीबी में मेटाडेटा और पथनाम संग्रहीत करना आईएमएचओ अच्छा और सामान्य अभ्यास है।

    ओरेकल ट्यूनिंग के बारे में: इसके बारे में किताबें लिखी गई हैं। मुझे मृत-पेड़-पेपरबैक प्रारूप में एक टन से अधिक तक कुल मिलाकर संदेह है। आप सबसे पहले ओरेकल प्रक्रिया 'मेमोरी खपत - थंब के नियम को देख सकते हैं: यदि यह एक छिद्र से कम है और आप बीएलओबी का उपयोग करते हैं, तो आप परेशानी में हैं। विभिन्न मेमोरी पूल पर पढ़ें और उन्हें कैसे बढ़ाएं। एक्सप्रेस संस्करण के लिए कुछ सीमा लागू हो सकती है।

  • +0

    कभी-कभी आप अलग-अलग स्थानों में अलग-अलग मशीनों से (सटीक) एक ही फ़ाइल तक पहुंचने में सक्षम होना चाहते हैं। यदि आपके पास एक केंद्रीय डीबी है तो यह एक अच्छा समाधान हो सकता है (अन्यथा आपको प्रत्येक मशीन को प्रत्येक मशीन में सिंक करना होगा और संभावित सिंक मुद्दों से निपटना होगा)। – alfasin

    +1

    +1 "आपको अपनी फाइलों को ... फाइलों के रूप में स्टोर करना चाहिए" –

    +0

    @ अल्फासिन: यह पहला बुलेट कवर है: * एक (साझा) फ़ाइल सिस्टम की अनुपलब्धता *। असल में आप डेटाबेस सिस्टम के साथ एक फाइल सिस्टम को प्रतिस्थापित करते हैं। –

    1

    यह ऐसा कोड नहीं है जिसका उपयोग आप अपने एसक्यूएल-डेवलपर के साथ कर सकते हैं, यह जावा कोड है जो एक ब्लॉब को इंसर्ट करने के लिए स्ट्रिंगबफर का उपयोग करता है। आशा है कि यह उपयोगी होगा:

    private void addBlob(oracle.jdbc.OracleConnection oracleConn, StringBuffer content) throws Exception 
    {  
         PreparedStatement st = null; 
         try {     
          oracle.sql.BLOB blob = oracle.sql.BLOB.createTemporary(oracleConn, true, oracle.sql.BLOB.DURATION_SESSION); 
    
          blob.setBytes(1, content.toString().getBytes("UTF-8")); 
    
          st = oracleConn.prepareStatement("INSERT INTO MYTABLE (id, content) VALUES (MYTABLE_S.NEXTVAL, ?)"); 
          st.setBlob(1, blob); 
          st.execute(); 
          st.close(); 
         } 
         catch (Exception e) { 
          utils.writeLog("Blob insertion Failed", e, utils.ERR); 
          throw e; 
         }   
         finally{ 
          st.close(); 
         } 
        }