Oracle数据库使用Java删除文件

时间:2009-09-16 15:56:45

标签: java oracle windows-server-2008 oracle11g

本周末有一个数据库(11.1.0.7)开始通过Java访问部分网络上的某些文件夹时出现问题。我使用了一小部分java来重现这个问题,除了创建文件对象并尝试删除文件之外什么都不做。来自 数据库适用于删除本地文件和删除\ zion \ dp \ share上的网络文件,但不能从我们的\ zion \ it \ share中删除。

我们有另一个在同一个域用户帐户下运行的数据库,从该位置删除文件没有问题。同时以服务器上的同一域用户身份登录有问题我可以在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) };
      }
   }
}

5 个答案:

答案 0 :(得分:0)

从数据库内部对操作系统运行的命令作为oracle帐户运行。因此,您需要在操作系统级别的上授予对oracle的读取和写入权限,以及在数据库中授予Java权限。

删除文件你真正想做什么?或者它只是一个测试?因为我们可以使用PL / SQL过程UTL_FILE.FREMOVE()删除文件。

答案 1 :(得分:0)

如果您拥有oracle管理员权限,请检查您的远程服务器(其他域服务器)主机名,并在Oracle Listeners列表下找到端口? (使用Oracle Netmanager)并检查listener.ora文件..

答案 2 :(得分:0)

“但创建一个文件对象并尝试删除该文件” 您能否确定删除是否失败,因为 a)找不到文件 文件名中有些奇怪的东西 b)文件被另一个进程锁定/打开 可能会有一些东西在看那个共享(复制,备份,病毒扫描) c)许可不足

底层文件系统是什么?

答案 3 :(得分:0)

如何发布整个代码块。另一个论坛表明您可能无法使用相同的文件句柄。 “但是我愿意打赌你试图根据FileOutputStream的变量'handle'删除文件。如果是这样的话,你就不能;你需要使用名称来创建一个文件对象创建FileOutputStream时使用的文件,然后delete()那个。“

在某些情况下它起作用的事实可能是“运气”而不是记录在案的行为。

PS。使用path的删除方法而不是文件看起来像失败将提供更多信息。

答案 4 :(得分:0)

Oracle支持建议在查看正在执行删除/存在操作时在oracle可执行文件上运行的Process Monitor的结果时重新启动服务器。他们发现该操作从远程服务器获得STATUS_USER_SESSION_DELETED (0xC0000203)的结果,这意味着本地和远程服务器之间的通信在Windows级别上无法正常工作。我们计划在本周末重启,看看是否能解决问题。