Oracle 11g不同版本Windows物理文件夹创建失败求助
解决Oracle 11g 32位实例无法通过Java存储过程创建网络共享目录的问题
问题背景
Windows环境下,两个Oracle 11g实例:
- DB-1:64位11.2.0.4,使用Java存储过程创建网络共享目录
\\130.78.62.105\RCM_Reports\Test_Dir_0769成功 - DB-2:32位11.2.0.3,执行相同代码创建失败
排查与解决步骤
1. 检查Oracle服务运行账号权限
- 确认DB-2的Oracle服务(如
OracleServiceORCL)运行账号是否有权访问目标共享目录:- 默认Local System账号无法访问网络共享,需切换为域账号或在共享服务器上具备读写权限的本地账号
- 手动在DB-2服务器上用该账号登录,尝试访问
\\130.78.62.105\RCM_Reports,验证能否正常读写、创建文件夹
2. 调整Java安全策略
- 编辑DB-2服务器上
%ORACLE_HOME%\javavm\lib\security\java.policy文件,添加文件系统操作权限:
(或更精确的路径权限:grant permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";grant permission java.io.FilePermission "\\\\130.78.62.105\\RCM_Reports\\*", "read,write";) - 修改后重启Oracle服务生效
3. 优化Java代码(捕获错误+支持多层目录)
原代码无错误反馈且仅能创建单层目录,修改如下:
create or replace and compile java source named "CreateDir_1" as import java.io.*; public class CreateDir_1 extends Object { public static void Create(String dir) throws IOException { File f = new File(dir); if (!f.mkdirs()) { -- 替换mkdir为mkdirs,支持创建多层目录 throw new IOException("创建失败:路径=" + dir + " | 已存在?" + f.exists() + " | 父目录存在?" + f.getParentFile().exists()); } } } / create or replace procedure create_dir_1 (p in varchar2) as language java name 'CreateDir_1.Create(java.lang.String)'; / -- 调用时捕获错误 set serveroutput on; begin create_dir_1('\\130.78.62.105\RCM_Reports\Test_Dir_0769'); exception when others then dbms_output.put_line('错误信息:' || sqlerrm); end; /
执行后通过dbms_output获取具体失败原因,针对性解决
4. 排查32位兼容性问题
- 尝试将路径中的反斜杠替换为正斜杠:
//130.78.62.105/RCM_Reports/Test_Dir_0769,32位Java虚拟机对路径解析可能存在差异 - 检查Windows UAC是否拦截32位Oracle进程的网络操作,可临时关闭UAC测试,或给Oracle主目录下的
bin\oracle.exe添加管理员权限
内容的提问来源于stack exchange,提问作者Shagar Mahabubjan
相关产品推荐
相关产品推荐

