2009-09-16 73 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