2009-09-16 76 views
0

本週末的某個時候,我們的一個數據庫(11.1.0.7)開始有問題通過Java訪問部分網絡上的某些文件夾。我使用java的一小部分來重現問題,它只做一個文件對象並嘗試刪除文件。從 數據庫中,這適用於刪除本地文件並刪除\ zion \ dp \ share中的網絡文件,但不能從\ zion \ it \ share中刪除。Oracle數據庫使用Java刪除文件

我們有另一個數據庫在相同的域用戶帳戶下運行,從這個位置刪除文件沒有問題。同時以服務器上的相同域用戶身份登錄,出現問題,我可以在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) }; 
     } 
    } 
} 
+0

刪除只是一個測試。真正的處理將pdf與值和另一個pdf合併,以寫出新的pdf。 – 2009-09-16 16:14:16

回答

0

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

+0

重新啓動盒子解決了問題。如果我擁有更大的維護時間窗口,我會試着重新啓動數據庫,但由於不相關的原因需要完全重新啓動,所以我沒有花時間來測試這個潛在的解決方案。 – 2009-09-28 13:09:31

0

命令對OS從裏面跑數據庫作爲oracle帳戶運行。因此,您需要在操作系統級別到oracle上對\ zion \ it \ 進行讀寫操作,並授予數據庫內的Java權限。

正在刪除文件,你實際上想要做什麼?還是隻是一個測試?因爲我們可以使用PL/SQL程序UTL_FILE.FREMOVE()刪除文件。

+0

你是對的,我們已經這麼做了。數據庫服務在完全控制涉及的所有網絡位置的域帳戶下運行。以該用戶身份登錄到數據庫服務器,我可以對網絡位置執行任何文件操作,並且在域帳戶(但Oracle的外部)下運行在服務器上的Java代碼也可以正常工作。只有從數據庫中運行的java中才有問題。 – 2009-09-16 16:11:56

+1

那麼,你的\ zion \ dp \ share與你的\ zion \ it \ share有什麼區別?或者,在週末發生了什麼? – APC 2009-09-16 16:17:50

+0

+1好問題。我一直試圖自己弄清楚。我一直無法找到發生的任何事情或任何改變。 – 2009-09-16 17:06:07

0

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

+0

我確實擁有Oracle管理員權限,但我不明白爲什麼我甚至需要另一臺機器的偵聽器。 – 2009-09-17 20:21:13

0

「但創建文件對象並嘗試刪除文件」 您可以確定刪除是否失敗,因爲 a)找不到文件 東西在文件名 b)奇文件被鎖定/開啓另一個進程 也許會有一些看那個份額(複製,備份,病毒掃描) C)沒有足夠的權限

什麼是基本的文件系統?

+0

文件系統都是Windows上的NTFS盒子。在我的測試中,文件名是x.txt和y.txt。這些文件由oracle服務以相同的域用戶身份登錄。我認爲我們可以排除奇怪的名稱和文件鎖定,因爲另一個Oracle服務器可以在Oracle之外刪除相同的文件和Java。權限可能是一個問題,但是正在使用相同的域用戶,這樣只會留下Oracle權限。存在相同的贈款,所以我不確定要查看其他許可權限。 – 2009-09-17 20:29:42

+0

代碼是否只是嘗試刪除或檢查文件是否存在並且是可寫的? (如http://www.java2s.com/Code/Java/File-Input-Output/Deletefile中的代碼使用JaaIOAPI.htm) 如果它不引發Oracle異常,我看不到它是Oracle權限問題。 也許一些奇怪的優化,不一定立即創建文件 – 2009-09-17 22:51:29

+0

該代碼只是一個刪除。我做了存在檢查分開代替刪除。我在運行應用程序之前自己創建文件。我將它創建爲數據庫服務使用的域用戶。 – 2009-09-18 13:00:49

0

如何發佈整個代碼塊。另一個論壇建議您可能無法使用相同的文件句柄。 「但是我敢打賭,你試圖根據FileOutputStream的變量'handle'來刪除文件,如果是這樣的話,你不能;你需要創建一個文件對象,使用名稱創建FileOutputStream時使用的文件,然後刪除()。「

事實上,它在某些情況下可能是'運氣'而不是記錄的行爲。

PS。使用path的刪除方法而不是文件看起來像失敗會更具信息性。

+0

我根本沒有使用FileOutputStream。幸運的是,它已經工作了10年,仍然可以從其他數據庫中工作,並且仍然可以在該數據庫上與其他人共享,即使在同一臺服務器上也是如此。不是我對運氣的定義。 你的建議發佈代碼是好的,但。 – 2009-09-21 13:57:22

+1

也許運氣不是話語的正確選擇。更多的無證,意外,不受支持的副作用已經失效,可能是由於應用了補丁。也就是說,代碼看起來非常明確。從Microsoft查找Filemon並在Windows框中運行它。也許有一個AV檢查器或索引服務可以鎖定文件一段時間。 – 2009-09-21 22:52:37

+0

+1好主意。我不認爲任何東西都可以鎖定我每次嘗試應用程序時創建的文件,但是當我在Oracle之外運行Java時會成功,但是它無法檢查。 – 2009-09-22 13:17:57