Oracle Database Javaを使用したファイルの削除
-
07-07-2019 - |
質問
今週末、データベースの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) };
}
}
}
解決 5
Oracleサポートは、削除/存在操作の実行中にOracle実行可能ファイルで実行されているプロセスモニターの結果を確認した後、サーバーを再起動することを提案しました。彼らは、アクションがリモートサーバーから STATUS_USER_SESSION_DELETED(0xC0000203)
の結果を取得することを発見しました。これは、ローカルサーバーとリモートサーバー間の通信がWindowsレベルで正しく機能していないことを意味します。この週末に再起動して、問題が解決するかどうかを確認する予定です。
他のヒント
コマンドは、 oracle
アカウントとして実行されるデータベース内からOSに対して実行されます。そのため、\ zion \ it \での読み取りと書き込みをOSレベルで に oracle
に許可するとともに、データベース内のJavaパーミッションを許可する必要があります。
ファイルを削除するのは、実際にやりたいことですか?それとも単なるテストですか? PL / SQLプロシージャ UTL_FILE.FREMOVE()。
Oracle管理者権限がある場合、リモートサーバー(他のドメインサーバー)のホスト名とポートがOracleリスナーリストで利用可能かどうかを確認します?? (Oracle Netmanagerを使用)、listener.oraファイルも確認します。
&quot;ただし、ファイルオブジェクトを作成し、ファイルの削除を試みます&quot; 削除が失敗したかどうかを判断できますか a)ファイルが見つかりません ファイル名がおかしい b)ファイルは別のプロセスによってロック/オープンされています その共有を見ているものがあるかもしれません(複製、バックアップ、ウイルススキャン) c)不十分な許可
基礎となるファイルシステムは何ですか?
コードチャンク全体の投稿についてはどうですか。別のフォーラムは、同じファイルハンドルを使用できない可能性があることを示唆しています。 &quot;しかし、FileOutputStreamの変数 'handle'に基づいてファイルを削除しようとしていることは間違いありません。その場合はできません。 FileOutputStreamの作成時に使用したファイルの名前を使用してFileオブジェクトを作成し、それをdelete()する必要があります。&quot;
一部のケースで機能するという事実は、文書化された動作ではなく「幸運」かもしれません。
PS。ファイルではなくパスのdeleteメソッドを使用する失敗はより有益なものになるようです。