Вопрос

Где-то в эти выходные у одной из наших баз данных (11.1.0.7) начались проблемы с доступом к определенным папкам в части сети через Java.Я воспроизвел проблему, используя небольшую часть java, которая ничего не делает, кроме создания файлового объекта и попытки удалить файл.Из базы данных это работает для удаления локальных файлов и сетевых файлов с нашего общего ресурса \zion\dp \, но не с нашего общего ресурса \zion\it \.

У нас есть другая база данных, которая работает под той же учетной записью пользователя домена, и у нее нет проблем с удалением файлов из этого расположения.Также зарегистрировался как тот же пользователь домена на сервере, у которого возникли проблемы, я могу запускать java вне Oracle и не испытывать проблем с удалением файлов.Пользователь домена имеет полный контроль над папкой и, войдя в систему как пользователь, я могу создавать, изменять и удалять файлы.

Если я не предоставил моему пользователю базы данных Oracle соответствующие разрешения dbms_java, я получаю соответствующую ошибку java.security.AccessControlException.После того, как я предоставляю разрешение, java запускается до завершения, команда delete возвращает false (ничего не удалено), и файл не удаляется.

Я открыл дело с Oracle, но, похоже, они больше не помогут, потому что это включает в себя файловые команды, запускаемые с уровня java, даже если это воспроизводимо только из среды Oracle.

Тестовый код:

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

Другой код, который, как я недавно обнаружил, не работает только с этим общим ресурсом и только при запуске из этой базы данных:

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) };
      }
   }
}
Это было полезно?

Решение 5

Служба поддержки Oracle предложила перезапустить сервер после просмотра результатов запуска Process Monitor на исполняемом файле Oracle, когда выполнялась операция удаления / существования. Они обнаружили, что действие получает результат STATUS_USER_SESSION_DELETED (0xC0000203) с удаленного сервера, что означает, что связь между локальным и удаленным сервером не работает правильно на уровне Windows. Мы планируем перезапустить на этих выходных, чтобы посмотреть, решит ли это проблему.

Другие советы

Команды, запущенные для операционной системы из базы данных, выполняются как учетная запись oracle . Поэтому вам нужно предоставить права на чтение и запись в \ zion \ it \ на уровне операционной системы для oracle , а также предоставить разрешения Java в базе данных.

Удаление файлов - это то, что вы действительно хотите сделать? Или это просто тест? Потому что мы можем удалить файлы с помощью процедуры PL / SQL UTL_FILE.FREMOVE () .

Если у вас есть права администратора oracle, проверьте, что имя хоста удаленного сервера (сервера другого домена) и порт доступны в списке прослушивателей Oracle ?? (используя Oracle Netmanager), а также проверьте файл listener.ora.

" но создайте объект файла и попытайтесь удалить файл " Можете ли вы определить, если удаление не удастся, потому что а) не может найти файл Что-то странное в имени файла б) файл заблокирован / открыт другим процессом Может быть что-то просматривает этот ресурс (репликация, резервное копирование, проверка на вирусы) в) Недостаточное разрешение

Каковы основные файловые системы?

Как насчет публикации всего фрагмента кода?Другой форум предполагает, что вы, возможно, не сможете использовать тот же дескриптор файла."Но я был бы готов поспорить, что вы пытаетесь удалить файл на основе переменной 'handle' FileOutputStream.Если это так, то вы не можете;вам нужно создать объект File, используя имя файла, используемого при создании FileOutputStream, а затем удалить() это."

Тот факт, что это работает в некоторых случаях, может быть скорее "удачей", чем документированным поведением.

PS.используя метод удаления из путь вместо того, чтобы файл выглядел как сбой, он будет более информативным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top