`
BlueDavy
  • 浏览: 155419 次
  • 性别: 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存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    java调用oracle含有clob参数的存储过程.doc

    "Java 调用 Oracle 含有 CLOB 参数的存储过程" Java 调用 Oracle 含有 CLOB 参数的存储过程是一种常用的数据库操作方式,下面是该过程的详细介绍: 1. 连接数据库 在 Java 中连接 Oracle 数据库需要使用 Oracle ...

    java连接oracle数据库jar包

    Java连接Oracle数据库主要依赖于JDBC(Java Database Connectivity)...正确引入Oracle JDBC驱动JAR包,并理解其使用方法,是开发Java数据库应用的基础。在实际开发中,还需要注意错误处理、性能优化和安全性等问题。

    java实现oracle数据库备份

    3. **调用Oracle备份命令**:Java程序将使用`Runtime.getRuntime().exec()`方法来调用Oracle的`exp`命令,该命令用于导出数据库。命令格式类似于:`exp <username>/<password>@<network_address> file=...

    java调用oracle存储过程

    总的来说,Java调用Oracle存储过程主要依赖于`CallableStatement`接口,它允许我们定义输入参数、输出参数以及输入/输出参数,并且可以处理存储过程的返回值。在处理返回值时,需要根据存储过程的返回类型选择合适的...

    java代码oracle数据库批量插入

    这是为了确保Java应用程序能够识别并使用Oracle的JDBC驱动。 - 通过`DriverManager.getConnection(url, user, password);`建立数据库连接。这里的`url`、`user`和`password`是在前一步骤中定义的连接信息。 #### 4....

    Java连接Oracle示例.rar

    3. **建立连接**:使用`java.sql.DriverManager`类的`getConnection()`方法建立与Oracle数据库的连接。首先需要注册驱动,然后提供数据库URL、用户名和密码。例如: ```java Class.forName("oracle.jdbc.driver....

    Java日历及备忘录

    Java日历及备忘录程序是一个实用的桌面应用程序,它模仿了Windows操作系统中的日历功能,并添加了备忘录管理特性。这个程序的核心是利用Java编程语言实现的,旨在帮助用户方便地查看日期并设置提醒,提高个人或工作...

    oracle在导出dmp缺少的exp.exewenjain

    - **使用Data Pump命令行工具"expdp"**:Oracle 10g及以后的版本推荐使用"expdp",它是"exp.exe"的增强版本,功能更强大且更易用。即使"exp.exe"缺失,也可以通过"expdp"完成数据导出,如`expdp username/password ...

    java-oracle.zip_Empoyee_java+oracle_oracle

    这个"java-oracle.zip"压缩包显然包含了关于如何使用Java连接Oracle数据库并进行操作的一个示例,特别地,它用到了Employee数据库。下面我们将详细探讨相关的Java和Oracle连接知识点。 1. **JDBC (Java Database ...

    JAVA+ORACLE公交信息管理系统

    本文将深入探讨使用JAVA和ORACLE技术构建的公交信息管理系统,揭示其核心原理与实现方式。 首先,JAVA作为一种跨平台的编程语言,以其丰富的类库、面向对象的特性以及良好的可移植性,成为了开发公交信息管理系统的...

    使用Java操作oracle数据库

    本节将深入探讨如何使用Java来操作Oracle数据库,特别是调用存储过程。 首先,我们需要了解JDBC的基本概念。JDBC是Java平台的标准接口,它允许Java程序连接到各种类型的数据库,包括Oracle。在Java中,我们通常通过...

    java jdbc oracle代码

    当我们谈论“Java JDBC Oracle代码”时,我们指的是使用Java的JDBC API来与Oracle数据库进行通信的程序。 在Java中,JDBC提供了以下核心概念: 1. **Driver Manager**: 这是JDBC的入口点,负责管理所有注册的...

    毕业设计-源码Java调用Oracle存储过程实现分页功能

    在这个毕业设计项目中,我们主要探讨的是如何使用Java语言调用Oracle数据库的存储过程来实现分页功能,这在Web应用程序中非常常见,尤其是在处理大数据量时,为了提高用户体验,分页是一种有效的数据展示方式。...

    Java设计模式-备忘录

    在Java中,备忘录类可以使用private构造函数和getter/setter方法来防止外部对象对状态的篡改。 3. **照料者(Caretaker)**:照料者负责保存和提供备忘录。它的职责是管理备忘录,但不应该了解备忘录的具体内容。在...

    Java - Oracle - 数据库 驱动包 jar

    在Java应用中,我们通常使用JDBC(Java Database Connectivity)API来实现对数据库的操作,而ojdbc14.jar正是Oracle数据库对应的JDBC驱动。 JDBC是Java平台上的标准接口,它允许Java程序与各种数据库进行通信。...

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

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

    简单 图书馆管理系统 Java+Oracle

    【标题】"简单 图书馆管理系统 Java+Oracle" 涉及到的主要知识点有: 1. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性著称。在这个图书馆管理系统中,Java被用作...

    ORACLE 10G java 驱动包

    使用这两个JAR文件时,开发者需要在Java项目的类路径中包含它们,以便编译和运行时能够找到必要的Oracle JDBC驱动。在Java代码中,通常会使用以下代码来建立数据库连接: ```java import java.sql.Connection; ...

Global site tag (gtag.js) - Google Analytics