Pregunta

En algún momento de este fin de semana, una de nuestras bases de datos (11.1.0.7) comenzó a tener problemas para acceder a ciertas carpetas en una parte de la red a través de Java. He reproducido el problema utilizando una pequeña porción de java que no hace nada más que crear un objeto de archivo e intentar eliminar el archivo. Desde el base de datos esto funciona para eliminar archivos locales y eliminar archivos de red en nuestro \ zion \ dp \ share, pero no de nuestro \ zion \ it \ share.

Tenemos otra base de datos que se ejecuta bajo la misma cuenta de usuarios de dominio que no tiene problemas para eliminar archivos de esta ubicación. También inicié sesión como el mismo usuario de dominio en el servidor que tiene problemas. Puedo ejecutar Java fuera de Oracle y no tengo problemas para eliminar archivos. El usuario del dominio tiene control total sobre la carpeta e inició sesión como usuario. Puedo crear, modificar y eliminar archivos.

Si no le he otorgado a mi usuario de la base de datos Oracle los permisos dbms_java apropiados, obtengo el error java.security.AccessControlException apropiado. Después de otorgar el permiso, Java se ejecuta hasta su finalización, el comando Eliminar devuelve falso (nada eliminado) y el archivo no se elimina.

Abrí un caso con Oracle, pero parece que ya no van a ayudar porque involucra comandos de archivos que se ejecutan desde la capa de Java a pesar de que solo es reproducible desde el entorno de Oracle.

Código de prueba:

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

Otro código que recientemente encontré falla solo en este recurso compartido y solo cuando se ejecuta desde esta base de datos:

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) };
      }
   }
}
¿Fue útil?

Solución 5

El soporte de Oracle sugirió reiniciar el servidor después de ver los resultados de Process Monitor ejecutándose en el ejecutable de Oracle mientras se realizaba la operación de eliminación / existencia. Descubrieron que la acción obtiene un resultado de STATUS_USER_SESSION_DELETED (0xC0000203) del servidor remoto, lo que significa que la comunicación entre el servidor local y el remoto no funciona correctamente a nivel de Windows. Planeamos reiniciar este fin de semana para ver si eso soluciona el problema.

Otros consejos

Los comandos

se ejecutan contra el sistema operativo desde el interior de la base de datos como la cuenta oracle . Por lo tanto, debe otorgar lectura y escritura en \ zion \ it \ en el nivel del sistema operativo a oracle , así como otorgar los permisos de Java dentro de la base de datos.

¿Eliminar archivos es lo que realmente quieres hacer? ¿O es solo una prueba? Porque podemos eliminar archivos utilizando el procedimiento PL / SQL UTL_FILE.FREMOVE () .

Si tiene permisos de administrador de Oracle, verifique el nombre de host del servidor remoto (otro servidor de dominio) y el puerto está disponible en la lista de oyentes de Oracle. (usando Oracle Netmanager) y también verifique el archivo listener.ora ..

" pero cree un objeto de archivo e intente eliminar el archivo " ¿Puedes determinar si la eliminación falla porque a) No puede encontrar el archivo Algo extraño en el nombre del archivo b) El archivo está bloqueado / abierto por otro proceso ¿Podría haber algo mirando ese recurso compartido (replicación, copia de seguridad, detección de virus) c) Permiso insuficiente

¿Cuáles son los sistemas de archivos subyacentes?

¿Qué tal publicar el fragmento de código completo? Otro foro sugiere que es posible que no pueda utilizar el mismo identificador de archivo. " Pero estaría dispuesto a apostar que está tratando de eliminar el archivo en función de la variable 'handle' del FileOutputStream. Si ese es el caso, no puedes; debe crear un Objeto de archivo con el nombre del archivo utilizado al crear FileOutputStream y luego eliminar () eso. "

El hecho de que funcione en algunos casos podría ser "suerte" en lugar de un comportamiento documentado.

PS. utilizando el método de eliminación de una ruta en lugar de un archivo Parece que un fallo será más informativo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top