Domanda

A volte questo fine settimana uno dei nostri database (11.1.0.7) ha iniziato ad avere problemi di accesso a determinate cartelle su una parte della rete tramite Java. Ho riprodotto il problema utilizzando una piccola porzione di Java che non fa altro che creare un oggetto file e tentare di eliminare il file. Dal database funziona per cancellare file locali ed eliminare file di rete sulla nostra condivisione \ zion \ dp \, ma non dalla nostra condivisione \ zion \ it \.

Abbiamo un altro database che viene eseguito con lo stesso account di utenti di dominio che non ha problemi a eliminare file da questa posizione. Inoltre ho effettuato l'accesso come lo stesso utente di dominio sul server con problemi che posso eseguire java al di fuori di Oracle e non ho problemi a eliminare File. L'utente del dominio ha il pieno controllo della cartella e ha effettuato l'accesso come utente che posso creare, modificare ed eliminare file.

Se non ho concesso al mio utente del database Oracle i permessi dbms_java appropriati, ricevo l'errore java.security.AccessControlException appropriato. Dopo aver concesso l'autorizzazione, java viene eseguito fino al completamento, il comando delete restituisce false (niente eliminato) e il file non viene eliminato.

Ho aperto un caso con Oracle, ma sembra che non aiuteranno più perché comporta l'esecuzione di comandi di file dal livello Java anche se è riproducibile solo dall'ambiente Oracle.

Codice test:

import java.io.*;               
import java.sql.*;                 
import java.util.*;             

public class Ajclass
{
   public static void ajprocedure(String pdfFileName) throws Exception
   {
      boolean result;
      try {
         System.out.println("Start!");

         File file = new File(pdfFileName);
         //result = file.delete();
         result = file.exists();
         if (result == true) 
           System.out.println("xxFile deleted.");
         else
           System.out.println("xxFile NOT deleted!");
         System.out.println("End!");
      } catch ( Exception e ) {
         throw(e);
      }         
   }
}

Altro codice che ho riscontrato di recente in errore solo su questa condivisione e solo quando eseguito da questo database:

import java.io.*;
import java.sql.*;

public class DirectoryListing
{
public static void getList(String directory) throws SQLException
   {
      File path = new File( directory );
      String[] list = path.list();
      String element;
      int CurrentFile;

      for(CurrentFile = 0; CurrentFile < list.length; CurrentFile++)
      {
        element = list[CurrentFile];
        #sql { INSERT INTO DIRECTORYLISTING (FILENAME) VALUES (:element) };
      }
   }
}
È stato utile?

Soluzione 5

Il supporto Oracle ha suggerito di riavviare il server dopo aver esaminato i risultati di Process Monitor in esecuzione sull'eseguibile Oracle mentre era in corso l'operazione di eliminazione / esistenza. Hanno scoperto che l'azione ottiene un risultato di STATUS_USER_SESSION_DELETED (0xC0000203) dal server remoto, il che significa che le comunicazioni tra il server locale e quello remoto non funzionano correttamente a livello di Windows. Abbiamo in programma di riavviare questo fine settimana per vedere se questo risolve il problema.

Altri suggerimenti

I comandi vengono eseguiti sul sistema operativo dall'interno del database come account oracle . Quindi è necessario concedere la lettura e la scrittura su \ zion \ it \ a livello di sistema operativo su oracle oltre a concedere le autorizzazioni Java all'interno del database.

L'eliminazione dei file è ciò che realmente vuoi fare? O è solo un test? Perché possiamo eliminare i file usando la procedura PL / SQL UTL_FILE.FREMOVE () .

Se si dispone delle autorizzazioni di amministratore Oracle, controllare il nome host e la porta del server remoto (altro server di dominio) è disponibile nell'elenco Oracle Listeners ?? (usando Oracle Netmanager) e controlla anche il file listener.ora ..

" ma crea un oggetto file e prova a cancellare il file " Puoi determinare se l'eliminazione non riesce perché a) Impossibile trovare il file Qualcosa di strano nel nome del file b) Il file è bloccato / aperto da un altro processo Potrebbe esserci qualcosa che guarda quella condivisione (replica, backup, scansione antivirus) c) Autorizzazione insufficiente

Quali sono i file system sottostanti?

Che ne dici di pubblicare l'intero pezzo di codice. Un altro forum suggerisce che potresti non essere in grado di utilizzare lo stesso filehandle. " Ma sarei disposto a scommettere che stai cercando di eliminare il file in base alla variabile 'handle' di FileOutputStream. In tal caso, non puoi; devi creare un oggetto file utilizzando il nome del file utilizzato durante la creazione di FileOutputStream, quindi eliminare () quello. "

Il fatto che funzioni in alcuni casi potrebbe essere "fortuna" piuttosto che comportamento documentato.

PS. utilizzando il metodo di eliminazione di un path anziché il file sembra che un fallimento sarà più informativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top