Frage

Irgendwann an diesem Wochenende eine unserer Datenbanken (11.1.0.7) begann Probleme beim Zugriff auf bestimmte Ordner auf einem Teil des Netzwerks durch Java mit. Ich habe das Problem mit einem kleinen Teil von Java reproduziert, die nichts tut, sondern ein Dateiobjekt erstellen und versuchen, die Datei zu löschen. Von dem Datenbank funktioniert dies für lokale Dateien zu löschen und Netzwerk-Dateien auf unserer \ zion \ dp \ share löschen, aber nicht von unserem \ zion \ it \ share.

Wir eine andere Datenbank, die unter dem gleichen Domain-Benutzer läuft Konto, das keine Probleme hat Dateien von diesem Standort aus zu löschen. Auch angemeldet als der Domänenbenutzer auf dem Server Probleme ich die Java außerhalb von Oracle laufen und haben keine Probleme, zu löschen Dateien. Der Domain-Benutzer hat die volle Kontrolle über die Ordner und angemeldet als Benutzer kann ich erstellen, ändern und löschen Sie Dateien.

Wenn ich nicht meine Oracle-Datenbank Benutzer die entsprechenden dbms_java Berechtigungen erteilt habe, habe ich den entsprechenden java.security.AccessControlException Fehler. Nachdem ich die Erlaubnis, die Java bis zur Fertigstellung läuft gewähren, der Löschbefehl gibt false zurück (nichts gelöscht) und die Datei gelöscht wird nicht.

öffnete ich einen Fall mit Oracle, aber es sieht aus wie sie nicht mehr helfen werden, weil es Datei Befehle beinhaltet von der Java-Schicht ausgeführt werden, auch wenn es nur reproduzierbar von der Oracle-Umgebung ist.

Testcode:

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

Anderer Code, den ich vor kurzem zu andernfalls nur gegen diesen Anteil gefunden und nur dann, wenn aus dem Innern dieser Datenbank ausführen:

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) };
      }
   }
}
War es hilfreich?

Lösung 5

Oracle-Unterstützung vorgeschlagen, den Server neu zu starten, nachdem die Ergebnisse von Process Monitor suchte auf der Oracle-ausführbare wird ausgeführt, während die Lösch- / existiert Betrieb stattfand. Sie fanden heraus, dass die Aktion ein Ergebnis von STATUS_USER_SESSION_DELETED (0xC0000203) vom Remote-Server bekommt, was bedeutet, dass die Kommunikation zwischen dem lokalen und Remote-Server funktioniert nicht richtig auf einer Windows-Ebene. Wir planen, an diesem Wochenende neu zu starten, um zu sehen, ob das das Problem behebt.

Andere Tipps

Befehle ausführen gegen die OS aus dem Innern der Datenbank als oracle Konto ausgeführt werden. Sie müssen also lesen gewähren und schreiben Sie auf \ zion \ it \ auf OS-Ebene als auch auf oracle als die Java-Berechtigungen innerhalb der Datenbank zu gewähren.

Ist das Löschen von Dateien, was Sie wirklich tun wollen? Oder ist es nur ein Test? Weil wir das Löschen von Dateien können mit dem PL / SQL-Prozedur UTL_FILE.FREMOVE () .

Wenn Sie Oracle Admin-Rechte haben, überprüfen Sie die Remote-Server (andere Domain-Server) Hostname und Port unter Oracle-Listener-Liste verfügbar ist ?? (Unter Verwendung von Oracle Netmanager) und auch listener.ora Datei überprüfen ..

„sondern ein Dateiobjekt erstellen und versuchen, die Datei zu löschen“ Können Sie bestimmen, ob das Löschen fehlschlägt, weil a) Sie kann die Datei nicht finden Etwas seltsam im Dateinamen b) Die Datei wird gesperrt / Öffnen von einem anderen Prozess Könnte es zu dieser Aktie (Replikation, Backup, Virenscan) auf der Suche etwas sein c) Unzureichende Berechtigung

Was sind die zugrunde liegenden Dateisysteme?

Wie wäre es den gesamten Code Chunk veröffentlichen. Ein weiteres Forum schlägt vor, dass Sie nicht die gleiche Dateihandle verwenden möglicherweise in der Lage. „Aber ich wäre bereit zu wetten, dass Sie versuchen, die Datei zu löschen, basierend auf der Variablen‚Griff‘des Outputstream Wenn das der Fall ist, kann man nicht;. Sie benötigen ein Dateiobjekt mit dem Namen der erstellen Datei verwendet, wenn die Outputstream erstellen, und dann löschen () das. "

Die Tatsache, dass es in einigen Fällen funktioniert könnte sein ‚Glück‘ nicht dokumentierte Verhalten.

PS. mit der Löschmethode eines Pfad rel="nofollow eher als Datei sieht aus wie ein Fehler informativer sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top