`
BlueDavy
  • 浏览: 153177 次
  • 性别: 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中(即使正确的情况也是),这就导致了按照正常的情况去写这段代码的话反而会出问题。

担心以后再次碰到这样的问题,备忘一下....

BlueDavy 2006-11-22 22:43 发表评论
分享到:
评论

相关推荐

    java调用oracle存储过程或者函数

    在Java编程中,调用Oracle数据库的存储过程和函数是常见的任务,这通常涉及到JDBC(Java Database Connectivity)API的使用。以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决...

    oracleClient安装包exp和imp文件.zip

    1. **数据迁移**:当需要将数据从一个Oracle数据库迁移到另一个Oracle数据库时,可以使用EXP和IMP。 2. **数据库备份和恢复**:定期执行EXP导出,可以在数据库出现问题时快速恢复到某个已知的良好状态。 3. **开发和...

    java 连接oracle12c 的jar包

    这是因为ojdbc7.jar包含了必要的类和方法,使得Java应用程序能够识别并使用Oracle 12c的验证协议。 为了在Java项目中使用ojdbc7.jar,你需要遵循以下步骤: 1. **下载ojdbc7.jar**:首先,从Oracle官方网站或者...

    java调用Oracle存储过程

    本文将深入探讨如何使用Java与Oracle数据库进行交互,并调用存储过程。 首先,确保你已经在你的开发环境中安装了Oracle JDBC驱动,通常为ojdbc.jar。这个驱动允许Java应用程序连接到Oracle数据库并执行SQL语句以及...

    oracle11g的BIN目录exp.exe下载

    3. **导出过程**:在使用exp.exe(或者expdp)时,你需要指定连接参数(如用户名、密码、数据库连接),以及要导出的对象和选项。例如,可以指定只导出特定的表、模式或者整个数据库。导出过程中,所有元数据和数据...

    JAVA 使用数据库连接池连接Oracle数据库全代码

    ### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...

    java调用Oracle存储过程的简单例子源码

    总的来说,Java调用Oracle存储过程涉及JDBC的使用、CallableStatement对象的创建和管理,以及对存储过程参数的正确处理。理解并掌握这些知识点,将有助于你更高效地进行Java与Oracle数据库的交互。通过提供的源码...

    java操作oracle的驱动包

    Java操作Oracle数据库主要依赖于Oracle提供的驱动包,这两个文件,`classes12.jar`和`ojdbc14.jar`,都是Oracle JDBC驱动程序的一部分,用于在Java应用程序中连接到Oracle数据库。下面将详细介绍这两个驱动包及其...

    Java调用oracle存储过程输出自定义对象或二维表

    在Java编程中,与Oracle数据库交互是常见的任务之一,而调用Oracle存储过程可以实现复杂的业务逻辑。本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们...

    JAVA 连接oracle数据库 实现简单的查询

    在Java编程中,连接Oracle数据库并执行...总的来说,Java连接Oracle数据库并进行查询涉及到JDBC API的使用,包括加载驱动、建立连接、执行SQL和处理结果。理解这些步骤和概念对于任何Java开发者来说都是基础且重要的。

    用java编程将txt文件数据导入oracle

    Java 编程将 TXT 文件数据导入 Oracle 数据库是指使用 Java 语言编写程序将 TXT 文件中的数据导入 Oracle 数据库中,以方便进行计算、统计等操作。下面将详细介绍该知识点。 标题:用 Java 编程将 TXT 文件数据...

    java连接oracle的jar包.zip

    Oracle JDBC驱动主要有 Thin 和 Thick 两种类型,ojdbc7.jar 属于 Thin 驱动,它是一个纯Java实现,不依赖于Oracle客户端的库,因此可以在任何支持Java的环境中使用。 Oracle JDBC驱动提供了以下功能: 1. 数据库...

    在oracle中使用java sources

    总结起来,"在Oracle中使用Java Sources"是一个高效且灵活的方法,能够充分利用Java的生态系统,包括调用API接口。然而,这也需要对Oracle数据库的Java支持、PL/SQL以及API接口的使用有深入理解,以确保代码的正确性...

    java连接Oracle数据库jar文件

    本文将详细介绍如何使用Java连接Oracle数据库,以及涉及的关键jar文件。 首先,Oracle的JDBC驱动分为两种类型: Thin驱动 和 Thick驱动。"Thin"驱动是一个纯Java实现,不依赖于Oracle客户端,而"Thick"驱动则需要...

    java中调用oracle

    在Java编程中,调用Oracle数据库是常见的任务,特别是在企业级应用开发中。Oracle数据库以其高性能、稳定性以及广泛的企业支持而被广泛应用。本篇将详细阐述如何在Java中与Oracle数据库进行交互,尤其是涉及存储过程...

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

    ### 快速Java和Oracle集成SSH开发注意问题 #### Oracle基本操作 **1. 登录** - 使用ORACLE系统自带管理员(SYSTEM)用户登录,权限设置为DBA(拥有广泛的权限)。通常,在进行数据库管理操作时,推荐使用具有...

    oracle exp imp详解

    导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理...

    java连接oracle数据库jar包ojdbc8

    要使用ojdbc8.jar连接Oracle数据库,首先需要将其添加到Java项目的类路径中。如果你使用的是Maven构建工具,可以在pom.xml文件中添加以下依赖: ```xml <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8...

    Java SE - Downloads | Oracle Technology Network | Oracle 中国.pdf

    3. Oracle License、Binary License、Documentation License等术语指的是与Java SE下载有关的许可协议,这些协议定义了用户在下载和使用Java SE时的法律约束和权利说明。 4. Oracle JDK(Java Development Kit)是...

Global site tag (gtag.js) - Google Analytics