簡體   English   中英

Oracle數據庫使用Java刪除文件

[英]Oracle Database Deleting Files Using Java

這個周末的某個時候,我們的數據庫之一(11.1.0.7)開始無法通過Java訪問部分網絡上的某些文件夾。 我使用一小部分Java重現了該問題,該Java除了創建文件對象並嘗試刪除文件外,什么也不做。 從數據庫中,這可用於刪除\\ zion \\ dp \\共享上的本地文件和網絡文件,但不適用於\\ zion \\ it \\共享中的文件。

我們有另一個在同一域用戶帳戶下運行的數據庫,從該位置刪除文件沒有問題。 還以服務器上的同一域用戶身份登錄時遇到問題,我可以在Oracle外部運行Java,並且刪除文件沒有問題。 域用戶對文件夾具有完全控制權,並以我可以創建,修改和刪除文件的用戶身份登錄。

如果尚未授予我的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) };
      }
   }
}

從數據庫內部針對操作系統運行的命令以oracle帳戶身份運行。 因此,您需要在操作系統級別上授予對oracle \\ zion \\ it \\ 上的讀寫權限,以及授予數據庫中的Java權限。

刪除文件是您真正想要的嗎? 還是只是測試? 因為我們可以使用PL / SQL過程UTL_FILE.FREMOVE()刪除文件。

如果您具有oracle管理員權限,請檢查您的遠程服務器(其他域服務器)的主機名,並且Oracle偵聽器列表下的端口是否可用? (使用Oracle Netmanager),並檢查listener.ora文件。

“但是創建一個文件對象並嘗試刪除該文件”您能確定刪除是否失敗,因為a)找不到文件名文件中有些奇怪b)文件被另一個進程鎖定/打開了可能查看該共享的內容(復制,備份,病毒掃描)c)權限不足

什么是基礎文件系統?

如何發布整個代碼塊。 另一個論壇建議您可能無法使用相同的文件句柄。 “但是我敢打賭,您正在嘗試根據FileOutputStream的變量'handle'刪除文件。如果是這種情況,則不能;您需要使用文件名創建一個File對象。創建FileOutputStream時使用的文件,然后將其刪除()。”

它在某些情況下有效的事實可能是“運氣”,而不是有據可查的行為。

PS。 使用路徑而不是文件的delete方法看起來像失敗會更有幫助。

Oracle支持建議在執行刪除/存在操作時查看在oracle可執行文件上運行的Process Monitor的結果后,重新啟動服務器。 他們發現該操作從遠程服務器獲得STATUS_USER_SESSION_DELETED (0xC0000203)的結果,這意味着本地和遠程服務器之間的通信在Windows級別上無法正常工作。 我們計划在本周末重新開始,以查看是否可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM