2014-09-18 16 views
12

Sık sık düzenli işlemlerin bir parçası olarak veritabanı sunucusunda bulunan bir dosyayı açmak zorunda olan bir web uygulaması ile aralıklı bir sorunum var. Ancak, zamanın büyük çoğunluğu için, bu işlevsiz rastgele zamanlarda, ilgili işlevler, karşılık gelen istekler, HTTP 400 hatalarını döndürmeye başlar. Apache sunucusunun sıçraması sorunu bir süreliğine çözer, ancak bir günde veya en fazla bir haftada her zaman döner. Aralıklı ORA-22288 hatası - Komut uzunluğu yanlış

I (hayır, kaçma gel!!) İlgili PL/SQL koduna bazı günlük ekledi, ben referans için aşağıda listeledik hangi:

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; 

O 400 çıkıyor hatalar aşağıdaki ORA-22288 hatası karşılık gelir:

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

sorum, neden operasyon aniden ve tekrar tekrar, daha önce aynı dosya sorun olmadan açılabilir nerede erroring başlayacak mı? Temel dosya hiçbir zaman değiştirilmez ve salt okunur izinlerle yalnızca program aracılığıyla açılır.

Şimdiye kadar yaptığım tüm forum kazma, çoğunlukla "kapatıp aç" çözümler üretiyordu, bu da ... evet.

Her türlü yardım büyük beğeni topluyor.

+1

Çok fazla açık dosya var mı? Bir yerlerde "kapat" eksik mi? –

+1

Oracle, işletim sistemindeki bir hatadan geçiyor gibi görünüyor. Googling "Program bir komut yayınladı, ancak komut uzunluğu yanlış" bu bana bir Windows sorunu olduğuna inanıyorum. Ana işletim sistemi ve işletim sistemi sürümünü ekleyebilir misiniz? –

+1

@JonHeller Evet, pek çok forum mesajını okuyordum, ancak henüz ilgili bir nedenin özel bir sözünü görmemiştim. Her şeye rağmen, işletim sistemi özellikleri şunlardır: Windows Server 2003 x64 SP 2 – JDS

cevap

0

Yüklenecek miktar için dbms_lob.getLength(bf_file) kullanmak yerine, lütfen DBMS_LOB.LOBMAXSIZE numaralı telefonu kullanmayı deneyin. Bu yardımcı olabilir.

1

Bu, tam olarak çalıştığınız kod olup olmadığından emin değilseniz veya SO için basitleştirdiyseniz emin değilim. Senin bfile temelde bir işaretçi, bu yüzden işaretçiyi oluşturduktan sonra dosya diskte değiştirilirse ne olur emin değilim. Bunun gibi anonim blokların, SQL deyimleriyle aynı şekilde ayrıştırılıp önbelleğe alındığından emin değilim.

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

Çoğu kişi anonim PL/SQL blok deyimlerini dikkate almalıdır diğer herhangi bir SQL deyimi gibi. Anonim bir PL/SQL bloğu ile ayrıştırılan bir imleçten FETCH yapamazsınız, ancak imlecinin diğer tüm imleçler gibi PARSE ve EXEC dbcall kodlarından geçmesi gerekir. – jeff6times7

0

Sen dikkat etmedi (ya da ben görmüyorum) uygulama sunucusunun çerçevesini ama yeterince şanslı uygulama sunucusu üzerinde java çalışıyor olması, sen kolaylaştırabilirsiniz: Uzun lafın kısası, bu deneyin Kodunuzu önemli ölçüde. Sorunu çözecek mi bilmiyorum ama en azından bfile'nin uzunluğunu bilme ihtiyacından kurtulacak.

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(); 
}