2014-09-18 10 views
12

मुझे एक वेब अनुप्रयोग के साथ एक अंतःक्रियात्मक समस्या है जिसे नियमित रूप से संचालन के हिस्से के रूप में डेटाबेस सर्वर पर स्थित फ़ाइल खोलनी होती है। अधिकांश समय के लिए, यह बिना किसी समस्या के कार्य करता है, हालांकि, यादृच्छिक समय पर, संबंधित अनुरोध HTTP 400 त्रुटियों को वापस करना शुरू करते हैं। अपाचे सर्वर को उछालने से समस्या को एक समय के लिए संबोधित किया जाता है, लेकिन यह हमेशा एक दिन या अधिकतर सप्ताह में लौटता है।इंटरमीटेंट ओआरए -22288 त्रुटि - कमांड लंबाई गलत

मैं प्रासंगिक PL/SQL कोड के लिए कुछ प्रवेश जोड़ा (कोई, दूर नहीं चला वापस आ जाओ!!) है, जो मैं संदर्भ के लिए नीचे दी हैं:

declare 
    bl_blob blob; 
    bf_file bfile := bfilename(<directory that totally exists>, <file that totally exists>); 
begin 
    dbms_lob.createTemporary(bl_blob, true); 
    dbms_lob.open(bf_file, dbms_lob.lob_readonly); 
    dbms_lob.open(bl_blob, dbms_lob.lob_readwrite); 
    dbms_lob.loadfromfile(bl_blob, bf_file, dbms_lob.getLength(bf_file)); 
    dbms_lob.close(bf_file); 
    return bl_blob; 
end; 

यह पता चला 400 त्रुटियों निम्नलिखित ORA-22,288 त्रुटि के अनुरूप:

file or LOB operation FILEOPEN failed 
The program issued a command but the command length is incorrect 

मेरा प्रश्न है, क्यों आपरेशन अचानक, और बार बार, बाहर erroring जहां पहले से ही फाइल मुद्दा बिना खोला जा सकता है शुरू होगा? अंतर्निहित फ़ाइल कभी नहीं बदला जाता है और केवल पढ़ने की अनुमति के साथ प्रोग्रामेटिक रूप से खोला जाता है।

अब तक किए गए सभी फोरम खुदाई ने ज्यादातर "इसे बंद कर दिया" समाधान प्रदान किया है, जो ... हाँ।

किसी भी मदद की बहुत सराहना की जाती है।

+1

बहुत सारी खुली फ़ाइलें? कहीं गायब 'बंद'? –

+1

ऐसा लगता है कि ओरेकल ऑपरेटिंग सिस्टम से सिर्फ एक त्रुटि से गुजर रहा है। गुगलिंग "कार्यक्रम ने एक आदेश जारी किया लेकिन कमांड की लंबाई गलत है" मुझे विश्वास है कि यह एक विंडोज़ समस्या है। क्या आप होस्ट ओएस और ओएस संस्करण जोड़ सकते हैं? –

+1

@ जोनहेलर हाँ, मैं कई फ़ोरम पोस्ट पढ़ता हूं, हालांकि, मैंने अभी तक प्रासंगिक अंतर्निहित कारण का कोई विशिष्ट उल्लेख नहीं देखा है। भले ही, ओएस विनिर्देश हैं: विंडोज सर्वर 2003 x64 एसपी 2 – JDS

उत्तर

0

लोड होने वाली राशि के लिए dbms_lob.getLength(bf_file) का उपयोग करने के बजाय, कृपया DBMS_LOB.LOBMAXSIZE का उपयोग करने का प्रयास करें। यह मदद कर सकता है।

1

मुझे यकीन नहीं है कि यह वास्तव में वह कोड है जो आप चल रहे हैं, या यदि आपने इसे SO के लिए सरल बना दिया है। आपका bfile मूल रूप से एक सूचक है, इसलिए मुझे यकीन नहीं है कि पॉइंटर स्थापित करने के बाद फ़ाइल डिस्क पर संशोधित होने पर क्या होता है। मुझे यह भी यकीन नहीं है कि इस तरह के अनाम ब्लॉक एसक्यूएल कथन के समान तरीके से पार्स और कैश किए जाते हैं। अपने अनुप्रयोग सर्वर के ढांचे

declare 
    bl_blob blob; 
    bf_file bfile; 
begin 
    bf_file := bfilename(<directory that totally exists>, <file that totally exists>); 
    dbms_lob.createTemporary(bl_blob, true); 
    dbms_lob.open(bf_file, dbms_lob.lob_readonly); 
    dbms_lob.open(bl_blob, dbms_lob.lob_readwrite); 
    dbms_lob.loadfromfile(bl_blob, bf_file, dbms_lob.getLength(bf_file)); 
    dbms_lob.close(bf_file); 
    return bl_blob; 
end; 
+0

अधिकांश लोगों को अज्ञात पीएल/एसक्यूएल ब्लॉक स्टेटमेंट्स पर विचार करना चाहिए किसी भी अन्य प्रकार के एसक्यूएल कथन की तरह। आप किसी अज्ञात पीएल/एसक्यूएल ब्लॉक के साथ पार्स किए गए कर्सर से फ़ेच नहीं कर सकते हैं, लेकिन उनके कर्सर को किसी भी अन्य कर्सर की तरह PARSE और EXEC dbcall कोड से गुज़रना पड़ता है। – jeff6times7

0

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

public void getFile (String oradir, String filename, String filesysdir) throws FileNotFoundException, IOException, SQLException, Exception { 
    CallableStatement s = this.conn.prepareCall("select bfilename(?,?) from dual"); 
    s.setString(1, oradir); 
    s.setString(2, filename); 
    OracleResultSet r = (OracleResultSet) s.executeQuery(); 
    if (r.next()) 
     saveBFILE(r.getBFILE(1), filesysdir); 
} 

private void saveBFILE (BFILE b, String dir) throws FileNotFoundException, IOException, SQLException { 
    b.openFile(); 
    InputStream s = b.getBinaryStream(); 
    InputStreamReader r = new InputStreamReader(s); 
    String name = b.getName(); 
    String path = dir == null ? name : dir + '/' + name; 
    System.out.println("creating " + name); 
    FileOutputStream w = new FileOutputStream(new File(path)); 
    int nb; 
    byte[] ba = new byte[4096]; 
    while ((nb = s.read(ba)) != -1) 
     w.write(ba, 0, nb); 
    w.close(); 
    b.closeFile(); 
} 
संबंधित मुद्दे