Oracle Database Удаление файлов с использованием Java - PullRequest
0 голосов
/ 16 сентября 2009

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

У нас есть другая база данных, которая работает под той же учетной записью пользователя домена, у которой нет проблем с удалением файлов из этого расположения. Также вошел в систему как тот же пользователь домена на сервере, у которого есть проблемы, я могу запустить 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 ]

0 голосов
/ 24 сентября 2009

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

0 голосов
/ 21 сентября 2009

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

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

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

0 голосов
/ 17 сентября 2009

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

0 голосов
/ 17 сентября 2009

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

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

0 голосов
/ 16 сентября 2009

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

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

...