`
sy1214
  • 浏览: 8082 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用Oracle EXP

 
阅读更多

一眼看过去相信大家都知道用Runtime.getRuntime().exec来调用,我的需求就是:
调用Oracle EXP命令完成备份,并返回生成的备份文件名,这个备份文件会很快在其他的地方被使用。
采用Runtime.getRuntime().exec我们都知道,需要处理它的InputStream,以避免出现执行的命令输出的信息过多使得进程被堵死,OK,按照这样的方法,开写:

String[] cmds = new String[ 3 ]; cmds[ 0 ] = " cmd " ; cmds[ 1 ] = " /C " ; cmds[ 2 ] = "exp username/password@sid file=xxx.dmp log=xxx.log"; Process process = Runtime.getRuntime().exec(cmds); try { InputStreamReader isr = new InputStreamReader(process.getInputStream()); BufferedReader br = new BufferedReader(isr); String line = null ; while ((line = br.readLine()) != null ) { System.out.println(line); } } catch (IOException ioe) { ioe.printStackTrace(); }

 

写完收工,执行,傻了,进程被挂S了,到底什么原因呢,开始瞎尝试,把读取process的InputStream的部分全部去掉,执行,竟然OK,更晕,但这个时候出现了一个问题,那就是没法知道什么时候备份文件完全生成了,如果在Runtime.getRuntime后去获取备份文件,那个时候甚至连备份文件都没生成,之后甚至尝试过轮询直到备份文件生成,再往下走,那样还是有问题,就是生成的那个备份文件永远都只有正常的一半的大小,只有在整个进程退出的时候它才正常的全部生成。
竟然碰到这样的问题,彻底晕,开始google,竟然只查到一篇和我这同样的问题,更郁闷的是那个帖子最后楼主写了一句“问题解决了”,但没写是怎么解决的,郁闷S。
只好自己开始尝试各种办法,上网抓人到处问,最后在自己不断的尝试下终于是出现了转机,在我的N+1次尝试的时候我改为只读取process的ErrorStream,然后执行,晕,OK了,在导出成功的情况下没有问题,但在导出有错误的时候(像sid不对,用户名错误,数据库没启动等)进程还是被挂S,但只要导出成功没问题,导出有错误的问题是很好处理的,OK,最后试验的代码改为这样:

        String[] cmds = new String[3];
        cmds[
0= "cmd";
        cmds[
1= "/C";
        cmds[
2]=commandBuf.toString();
        Process process
=Runtime.getRuntime().exec(cmds);
        
boolean shouldClose=false;
        
try {
            InputStreamReader isr 
= new InputStreamReader(process.getErrorStream());
            BufferedReader br 
= new BufferedReader(isr);
            String line 
= null;
            
while ((line = br.readLine()) != null){
                
if(line.indexOf("错误")!=-1){
                    shouldClose
=true;
                    
break;
                }

            }

        }
 
        
catch (IOException ioe) {
            shouldClose
=true;
        }

        
if(shouldClose)
            process.destroy();
        
int exitVal = process.waitFor();

当然,实际的代码中不能像这里写的一样,直接去判断是否含错误这个字符串,而且这段代码是只适合在winnt版本以上的windows操作系统上执行的。
这样反而可以了,说明什么呢,说明在执行oracle的exp时,出现了一个很怪的现象,就是exp在console输出的信息没有被放入InputStream,反而是放到了ErrorStream中(即使正确的情况也是),这就导致了按照正常的情况去写这段代码的话反而会出问题。

分享到:
评论
1 楼 joachimz 2008-05-28  
感觉应该waitFor()等待,另一个线程同步去读取InputStream, ErrorStream
new Thread() {
  // 监控,读取inputStream
}
int exitVal= process.waitFor();
process.destroy();

相关推荐

    java导出oracle数据(单表)

    该命令使用 exp 工具来导出 Oracle 数据库中的数据。我们可以根据需要添加不同的参数,例如用户名、密码、数据库名、表名、导出地址、数据过滤条件等。 知识点 3:执行 DOS 命令并处理错误 在 Java 中,可以使用 ...

    java导出oracle数据(单表).pdf

    本例提供了一个使用 Java 导出 Oracle 数据的示例代码,涵盖了 Oracle 数据库的连接、exp 命令的使用、Process 类的使用、异常处理、StringUtil 工具类的使用、Log4j 日志记录和 Oracle 数据库的导入等知识点。

    Java导出Oracle数据库数据

    本文将介绍如何使用 Java 语言将 Oracle 数据库数据导出到文件中,并将其导入到 Oracle 数据库中。 从标题和描述中可以看到,本文的主要内容是使用 Java 语言将 Oracle 数据库数据导出到文件中,并将其导入到 ...

    java实现oracle数据库备份.pdf

    传统的备份方式通常通过命令行工具来完成,例如使用Oracle提供的`exp`命令导出数据,`imp`命令导入数据。这种方式对于技术人员来说较为简单,但对于非技术用户而言可能过于复杂且容易出错。因此,将备份功能集成到...

    java备份还原oracle数据库知识.pdf

    Java备份Oracle数据库是指使用Java语言编写的程序来备份Oracle数据库,备份的过程中需要使用Oracle的EXP工具来将数据库导出到一个文件中。下面是Java备份Oracle数据库的主要知识点: 1. 使用EXP工具备份数据库:EXP...

    java导出oracle数据(单表).docx

    该过程使用了 Java 语言的 Runtime.getRuntime().exec() 方法来执行 Oracle 的 exp 命令,实现了数据的导出。 知识点 1:Java 中的 Runtime.getRuntime().exec() 方法 在 Java 中,Runtime.getRuntime().exec() ...

    oracle imp exp几点应用技巧

    在Oracle环境中,`SQLPLUS.EXE` 是一个常用的工具,它调用`EXP.EXE` 和 `IMP.EXE` 来实现数据的导出和导入。这些可执行文件可能实际上是Java编写的类的封装版本,这意味着它们可能是通过Java虚拟机(JVM)执行的。...

    我的总结oracle java 环境 oracle 卸载.docx

    Oracle Java 环境配置与 Oracle卸载 Oracle Java 环境配置是指在计算机中安装和配置 Oracle 数据库和 Java 环境,以便进行开发和测试。在本文中,我们将介绍 Oracle Java 环境配置的步骤,包括安装 JDK、配置环境...

    快速Java和Oracle集成SSH开发注意问题.pdf

    - 使用ORACLE系统自带管理员(SYSTEM)用户登录,权限设置为DBA(拥有广泛的权限)。通常,在进行数据库管理操作时,推荐使用具有足够权限的用户登录。 **2. 创建用户表空间** - 表空间是Oracle数据库中用于组织...

    java Oracle备份

    根据提供的文件信息,我们可以深入探讨如何使用Java通过外部系统命令模式来备份Oracle数据库。下面将详细解释相关的知识点。 ### Java Oracle备份:系统命令模式备份数据库 #### 一、背景介绍 在企业级应用环境中...

    Java导入导出Oracle[文].pdf

    本文件“Java导入导出Oracle[文].pdf”显然提供了一种利用Java程序来实现Oracle数据库的导入(exp)和导出(imp)的方法,并涉及到创建表空间、用户以及给用户授权的操作。以下是根据提供的代码片段详细解释这些知识...

    java程序调用bat文件,执行oracel数据库备份

    首先,我们需要理解Java调用外部程序的基本原理。在Java中,我们可以使用`Runtime`类或`ProcessBuilder`类来执行操作系统级别的命令,例如运行bat文件。以下是一个简单的示例,展示如何使用`Runtime.getRuntime()....

Global site tag (gtag.js) - Google Analytics