本周末有一个数据库(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) };
}
}
}
答案 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级别上无法正常工作。我们计划在本周末重启,看看是否能解决问题。