Question

Ce week-end, l'une de nos bases de données (11.1.0.7) a commencé à avoir des problèmes pour accéder à certains dossiers sur une partie du réseau via Java. J'ai reproduit le problème en utilisant une petite partie de Java qui ne fait que créer un objet fichier et tenter de supprimer le fichier. Du Cela fonctionne pour la suppression de fichiers locaux et de fichiers réseau sur notre \ zion \ dp \ share, mais pas à partir de notre \ zion \ it \ share.

Nous avons une autre base de données qui s'exécute sous le même compte d'utilisateur de domaine et qui n'a aucun problème à supprimer les fichiers de cet emplacement. Également connecté en tant que même utilisateur de domaine sur le serveur ayant des problèmes, je peux exécuter le java en dehors d'Oracle et je n'ai aucun problème à supprimer. des dossiers. L'utilisateur du domaine contrôle totalement le dossier et est connecté en tant qu'utilisateur que je peux créer, modifier et supprimer des fichiers.

Si je n'ai pas accordé les autorisations appropriées à mon utilisateur de base de données oracle dbms_java, j'obtiens l'erreur appropriée java.security.AccessControlException. Après avoir accordé l’autorisation, java s’achève, la commande de suppression renvoie la valeur false (rien d’effacé) et le fichier n’est pas supprimé.

J'ai ouvert un dossier avec Oracle, mais il semble qu'ils ne vont plus aider, car il implique que des commandes de fichier soient exécutées à partir de la couche java, même si elle ne peut être reproduite qu'à partir de l'environnement Oracle.

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

Un autre code que j'ai récemment constaté n'échoue que sur ce partage et uniquement lorsqu'il est exécuté depuis cette base de données:

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) };
      }
   }
}
Était-ce utile?

La solution 5

Oracle a suggéré de redémarrer le serveur après avoir examiné les résultats de Process Monitor en cours d'exécution sur l'exécutable oracle alors que l'opération delete / exist était en cours. Ils ont constaté que l'action obtenait le résultat de STATUS_USER_SESSION_DELETED (0xC0000203) à partir du serveur distant, ce qui signifie que les communications entre le serveur local et le serveur distant ne fonctionnaient pas correctement au niveau de Windows. Nous prévoyons de redémarrer ce week-end pour voir si cela résout le problème.

Autres conseils

Les commandes exécutées sur le système d'exploitation depuis la base de données sont exécutées sous le compte oracle . Vous devez donc autoriser la lecture et l’écriture sur \ zion \ it \ au niveau du système d’exploitation vers oracle , ainsi que l’octroi des autorisations Java dans la base de données.

La suppression de fichiers est-elle ce que vous voulez réellement faire? Ou est-ce juste un test? Parce que nous pouvons supprimer des fichiers en utilisant la procédure PL / SQL UTL_FILE.FREMOVE () .

Si vous disposez des autorisations d'administrateur Oracle, vérifiez que le nom d'hôte de votre serveur distant (autre serveur de domaine) et son port sont disponibles dans la liste des écouteurs Oracle ?? (avec Oracle Netmanager) et vérifiez également le fichier listener.ora.

"mais créez un objet fichier et tentez de supprimer le fichier" Pouvez-vous déterminer si la suppression échoue parce que a) Il ne trouve pas le fichier Quelque chose d'étrange dans le nom du fichier b) Le fichier est verrouillé / ouvert par un autre processus Peut-il y avoir quelque chose à regarder ce partage (réplication, sauvegarde, analyse de virus) c) Autorisation insuffisante

Quels sont les systèmes de fichiers sous-jacents?

Que diriez-vous de poster la totalité du code. Un autre forum suggère que vous ne pourriez peut-être pas utiliser le même descripteur de fichier. "Mais je serais prêt à parier que vous essayez de supprimer le fichier en fonction de la variable 'handle' du FileOutputStream. Si c'est le cas, vous ne pouvez pas; vous devez créer un objet fichier en utilisant le nom du fichier utilisé lors de la création de FileOutputStream, puis delete () that. "

Le fait que cela fonctionne dans certains cas peut être dû à un "hasard" plutôt qu'à un comportement documenté.

PS. en utilisant la méthode delete du chemin plutôt que du fichier ressemble à un échec sera plus informatif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top