0

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

我们有另一个在同一域用户帐户下运行的数据库,从该位置删除文件没有问题。还以服务器上的同一域用户身份登录,但我可以在 Oracle 之外运行 java,并且在删除文件时没有问题。域用户可以完全控制文件夹并以我可以创建、修改和删除文件的用户身份登录。

如果我没有授予我的 oracle 数据库用户适当的 dbms_java 权限,我会收到适当的 java.security.AccessControlException 错误。在我授予 java 运行完成的权限后,删除命令返回 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) };
      }
   }
}
4

5 回答 5

0

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

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

于 2009-09-16T16:06:32.430 回答
0

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

于 2009-09-16T22:19:41.790 回答
0

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

什么是底层文件系统?

于 2009-09-17T07:51:23.397 回答
0

如何发布整个代码块。另一个论坛建议您可能无法使用相同的文件句柄。“但我敢打赌,您正试图根据 FileOutputStream 的变量 'handle' 删除文件。如果是这种情况,您不能;您需要使用名称创建一个文件对象创建 FileOutputStream 时使用的文件,然后删除()那个。”

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

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

于 2009-09-20T22:37:41.583 回答
0

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

于 2009-09-24T18:38:22.957 回答