zoukankan      html  css  js  c++  java
  • Java备份Oracle数据库

    Java备份Oracle数据库  

    Java线程、Process、ProcessBuilder

    2010 年 6 月 20 日

    文章内容描述了使用Java执行外部Oracle导出命令备份数据库功能的示例,依据此例子进行修改制造一些bug,然后将会对Java外部命令这块会有一个更加清晰的认知(个人观点仅供参考,不许拍砖,哈)


    小细节
    ·试着把innerTh.start()这段给注释掉,然后再把用户名或密码写错。
    ·有些程序是不会在命令行有输出的,比如最直接的plsqldev.exe、MindManager.exe
    ·试着把将要执行的命令改成我们本地相关.exe程序,如上面所例或干脆TM.exe试试。

    回页首
    代码示例:
    [java] view plain copy
     
     print?
    1. package org.ybygjy.basic.oracle;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileOutputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStream;  
    7. import java.nio.ByteBuffer;  
    8. import java.nio.channels.Channels;  
    9. import java.nio.channels.FileChannel;  
    10. import java.nio.channels.ReadableByteChannel;  
    11. import java.util.ArrayList;  
    12. import java.util.List;  
    13. import java.util.Map;  
    14.   
    15. /** 
    16.  * java外部系统命令模式备份数据库 
    17.  * @author WangYanCheng 
    18.  * @version 2010-6-19 
    19.  */  
    20. public class BackupOracleDatabase {  
    21.     /** 
    22.      * 封装执行入口 
    23.      */  
    24.     public void doWork() {  
    25.         InnerClass innerInst =  
    26.             new InnerClass("DB_USER", "DB_PASS", "127.0.0.1:1521/ORCL", "E:/dbback/BACK201006.DMP");  
    27.         Thread thInst = new Thread(innerInst);  
    28.         thInst.start();  
    29.     }  
    30.   
    31.     /** 
    32.      * 用于分担执行命令 
    33.      * @author WangYanCheng 
    34.      * @version 2010-6-19 
    35.      */  
    36.     class InnerClass implements Runnable {  
    37.         /** 用户名 */  
    38.         private String userName;  
    39.         /** 密码 */  
    40.         private String userPass;  
    41.         /** 服务地址 */  
    42.         private String serverAddr;  
    43.         /** 输出文件路径 */  
    44.         private String outFilePath;  
    45.   
    46.         /** 
    47.          * constructor 
    48.          * @param userName userName 
    49.          * @param userPass userPass 
    50.          * @param serverAddr 服务地址必须带<strong>端口</strong>/<strong>SID</strong> 
    51.          * @param outFilePath outPath 
    52.          */  
    53.         public InnerClass(String userName, String userPass, String serverAddr, String outFilePath) {  
    54.             this.userName = userName;  
    55.             this.userPass = userPass;  
    56.             this.serverAddr = serverAddr;  
    57.             this.outFilePath = outFilePath;  
    58.         }  
    59.   
    60.         /** 
    61.          * 提供执行的命令串 
    62.          * @return commStr 命令串 
    63.          */  
    64.         private List doBuildCommand() {  
    65.             List rtnList = new ArrayList();  
    66.             rtnList.add("EXP");  
    67.             rtnList.add("@USER@/@PASSWORD@@@SERVER@".replaceAll("@USER@", this.userName)  
    68.                 .replaceAll("@PASSWORD@", this.userPass).replaceAll("@SERVER@", this.serverAddr));  
    69.             rtnList.add("FILE=/"@FILE@/"".replaceAll("@FILE@", this.outFilePath));  
    70.             rtnList.add("TABLES=(SY_TABLE_DEF)");  
    71.             return rtnList;  
    72.         }  
    73.         /** 
    74.          * 构建ProcessBuilder实例 
    75.          * @param workDir 当前进程工作目录 
    76.          * @return pbInst ProcessBuilder实例 
    77.          * @see ProcessBuilder 
    78.          */  
    79.         private ProcessBuilder buildProcessBuilder(File workDir) {  
    80.             new ProcessBuilder();  
    81.             List commandArray = (doBuildCommand());  
    82.             ProcessBuilder pbInst = new ProcessBuilder(commandArray);  
    83.             pbInst.command(commandArray);  
    84.             Map envMap = pbInst.environment();  
    85.             envMap.clear();  
    86.             envMap.putAll(System.getenv());  
    87.             pbInst.directory(workDir);  
    88.             pbInst.redirectErrorStream(true);  
    89.             return pbInst;  
    90.         }  
    91.         /** 
    92.          * 线程执行入口 
    93.          */  
    94.         public void run() {  
    95.             File tmpOutFile = new File(this.outFilePath);  
    96.             File outDir = tmpOutFile.getParentFile();  
    97.             ProcessBuilder pbInst = buildProcessBuilder(outDir);  
    98.             try {  
    99.                 Process proInst = pbInst.start();  
    100.                 final InputStream ins = proInst.getInputStream();  
    101.                 File outFile = new File(outDir, "exp.log");  
    102.                 outFile.createNewFile();  
    103.                 final FileChannel focInst = new FileOutputStream(outFile).getChannel();  
    104.                 Thread innerTh = new Thread() {  
    105.                     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  
    106.                     public void run() {  
    107.                         ReadableByteChannel rbcObj = Channels.newChannel(ins);  
    108.                         try {  
    109.                             while (rbcObj.read(byteBuffer) != -1) {  
    110.                                 byteBuffer.flip();  
    111.                                 focInst.write(byteBuffer);  
    112.                                 byteBuffer.clear();  
    113.                             }  
    114.                         } catch (IOException ioe) {  
    115.                             ioe.printStackTrace();  
    116.                         }  
    117.                     }  
    118.                 };  
    119.                 // innerTh.setDaemon(true);  
    120.                 innerTh.start();  
    121.             } catch (IOException ioe) {  
    122.                 ioe.printStackTrace();  
    123.             }  
    124.         }  
    125.     }  
    126.   
    127.     /** 
    128.      * 测试入口 
    129.      * @param args 参数列表 
    130.      */  
    131.     public static void main(String[] args) {  
    132.         new BackupOracleDatabase().doWork();  
    133.     }  
    134. }  
  • 相关阅读:
    netty同时做http和websocket(netty入门)
    curl的概念及相关工具下载
    当删除某一个jar包时tomcat中出现problem encountered while deleting resources问题
    一个servlet处理多个请求或者叫方法
    在web中实现当前变量和前一个的比较
    URL中可以出现的字符
    在Editplus直接运行程序的步骤
    socket的相关知识理解
    011 python接口 bs4提取结果
    010 python接口 bs4解析html
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6255087.html
Copyright © 2011-2022 走看看