`
BlueDavy
  • 浏览: 153440 次
  • 性别: 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数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或高效数据操作时。本文将全面总结如何使用Java与Oracle存储过程进行交互。 首先,理解Oracle存储过程的基本概念。存储过程是预编译...

    Oracle教程,java调用oracle

    11. **Java调用存储过程和存储函数**:Java开发者可以使用JDBC(Java Database Connectivity)API来调用Oracle的存储过程和函数,实现数据库操作。CallableStatement接口用于这个目的,允许传递参数并接收返回值。 ...

    java实现oracle数据库备份.pdf

    - **后端**:利用Java调用Oracle的导出工具`exp`完成数据备份。 2. **备份流程设计**: - 用户通过JSP页面输入数据库用户名、密码、网络连接名以及备份文件名等信息。 - 提交表单后,Java后端处理这些信息,并...

    JAVA调用ORACLE存储过程通用类

    ### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...

    java代码oracle数据库批量插入

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

    oracle11g的BIN目录exp.exe下载

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

    java调用oracle存储过程.docx

    本文将详细介绍如何使用Java来调用Oracle中的存储过程,并通过具体示例加以说明。 #### 二、准备工作 ##### 1. 创建表 首先,在Oracle数据库中创建一个用于测试的表: ```sql CREATE TABLE system.T_DEMO1 ( "ID...

    java调用oracle存储过程

    总结,Java调用Oracle存储过程的关键在于使用`CallableStatement`,根据存储过程的参数类型,正确地设置IN、OUT或IN/OUT参数。同时,别忘了在操作完成后关闭所有数据库资源,以避免资源泄漏。在实际应用中,可能还...

    使用Java操作oracle数据库

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

    java实现备忘时钟

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个备忘时钟应用程序。这个项目非常适合初学者,因为它涵盖了基础的Java编程概念,如时间处理、事件监听和用户界面设计。我们将逐步解析实现这样一个功能所需的...

    java连接oracle数据库实例及所需jar文件

    4. **加载驱动并建立连接**:使用`DriverManager`类的`registerDriver()`方法注册Oracle JDBC驱动,然后调用`getConnection()`方法建立连接。 ```java try { Class.forName("oracle.jdbc.driver.OracleDriver"); ...

    oracle的expimp使用方法学习

    Oracle数据库的备份是确保数据安全的关键操作,而`exp`和`imp`是Oracle数据库中用于逻辑备份的主要工具。这两个命令允许用户将数据库中的数据导出(exp)到文件,然后在需要时导入(imp)回数据库。逻辑备份在某些...

    基于Java,Oracle数据库的信息管理系统源码.zip

    这是一个基于Java编程语言和Oracle数据库开发的信息管理系统源代码项目,名为"hotel-management-master"。这个系统主要用于帮助管理者高效地处理员工信息和用户数据,尤其适用于酒店行业的信息管理。以下是关于这个...

    Java链接Oracle 存储过程 jdbc BLOG

    本文将深入探讨如何使用JDBC(Java Database Connectivity)API来调用Oracle数据库的存储过程。 首先,确保你的项目中已经包含了Oracle JDBC驱动,通常为ojdbc.jar或ojdbc6.jar。这个驱动允许Java应用程序与Oracle...

    在oracle中使用java sources

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

    测试java和oracle是否连接正常的小代码

    本文将深入探讨如何使用Java来测试与Oracle数据库的连接,并重点讲解提供的"getMetaData.java"源代码。 首先,Java通过JDBC(Java Database Connectivity)API与各种数据库进行交互。Oracle提供了JDBC驱动,例如...

    oracle调用java 使用socket监听端口测试

    本篇文章将详细探讨如何在Oracle环境中通过Java使用Socket进行通信,监听端口并进行相关的测试。 首先,我们需要理解Socket编程的基本概念。Socket是网络通信中的一个接口,它允许应用程序之间通过网络交换数据。在...

    达内Java的Oracle的PDF

    【标题】"达内Java的Oracle的PDF"涵盖了关于Java编程与Oracle数据库的结合使用,是达内教育机构提供的一份教程资料。这份PDF可能是针对初学者或希望深入理解Java在Oracle环境中应用的专业人士设计的。达内是一家知名...

    Oracle数据库逻辑增量备份之exp/imp

    本文将深入探讨Oracle数据库中使用exp/imp工具进行逻辑增量备份的方法及其恢复策略。 1一、实现需求 在Oracle数据库环境中,确保数据安全性和可用性是关键。逻辑增量备份的主要目标是在最小化系统停机时间和资源...

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

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

Global site tag (gtag.js) - Google Analytics