0

今週末のある時点で、データベースの 1 つ (11.1.0.7) で、Java を介してネットワークの一部にある特定のフォルダーにアクセスする際に問題が発生し始めました。ファイルオブジェクトを作成してファイルを削除しようとするだけの Java のごく一部を使用して、問題を再現しました。データベースからは、\zion\dp\ 共有のローカル ファイルとネットワーク ファイルの削除には機能しますが、\zion\it\ 共有からは機能しません。

この場所からファイルを削除しても問題のない同じドメイン ユーザー アカウントで実行される別のデータベースがあります。問題のあるサーバーに同じドメインユーザーとしてログインしても、Oracleの外部でJavaを実行でき、ファイルの削除に問題はありません。ドメイン ユーザーはフォルダーを完全に制御でき、ファイルを作成、変更、および削除できるユーザーとしてログインします。

Oracle データベース ユーザーに適切な dbms_java 権限を付与していない場合、適切な java.security.AccessControlException エラーが発生します。Java が完了するまで実行する権限を付与した後、delete コマンドは false (何も削除されていない) を返し、ファイルは削除されません。

Oracle にケースをオープンしましたが、Oracle 環境からしか再現できないにもかかわらず、Java レイヤーからファイル コマンドを実行する必要があるため、これ以上役に立たないようです。

テストコード:

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

コードチャンク全体を投稿するのはどうですか。別のフォーラムでは、同じファイルハンドルを使用できない可能性があると示唆しています。「しかし、FileOutputStream の変数 'ハンドル' に基づいてファイルを削除しようとしていることに賭けても構わないと思います。その場合は削除できません。ファイル オブジェクトの名前を使用してファイル オブジェクトを作成する必要があります。 FileOutputStream を作成するときに使用されるファイルを削除し、それを delete() します。」

場合によっては機能するという事実は、文書化された動作ではなく「運」かもしれません。

PS。ファイルではなくパスの削除メソッドを使用すると、失敗のように見えますが、より有益になります。

于 2009-09-20T22:37:41.583 に答える
0

Oracle サポートは、削除/存在操作の実行中に Oracle 実行可能ファイルで実行されている Process Monitor の結果を確認した後、サーバーを再起動することを提案しました。彼らは、アクションがSTATUS_USER_SESSION_DELETED (0xC0000203)リモート サーバーから結果を取得することを発見しました。これは、ローカル サーバーとリモート サーバー間の通信が Windows レベルで正しく機能していないことを意味します。今週末に再起動して、問題が解決するかどうかを確認する予定です。

于 2009-09-24T18:38:22.957 に答える
0

「しかし、ファイルオブジェクトを作成し、ファイルを削除しようとします」削除が失敗したかどうかを判断できますか a) ファイルが見つからない ファイル名に奇妙なものがある b) ファイルがロックされている/別のプロセスによって開かれているその共有を見ている何か (複製、バックアップ、ウィルススキャン) c) 権限が不十分

基盤となるファイル システムは何ですか?

于 2009-09-17T07:51:23.397 に答える