如何从Java程序中检索db2命令输出

时间:2012-03-06 07:55:53

标签: java command-line db2

我无法在Java程序中检索"db2 list db directory"命令的输出。基本上,我想要做的是: -

  1. 在本地系统中使用db2实例填充组合框
  2. 用户从组合框中选择特定实例
  3. 运行新进程以列出该实例的数据库
  4. 将数据库显示为另一个组合框
  5. 这是我所做的一段代码: -

    // dbinstances is a Combo box (Eclipse SWT widget)
    
    this.dbInstances.addSelectionListener(new SelectionListener() {
    
        @Override
        public void widgetSelected(SelectionEvent arg0) {
    
            // get selected instance name 
            String instance = dbInstances.getText();
    
            // command invokes db2 command window, sets current instance and issues list db command
            String command = "db2cmd /c \"set DB2INSTANCE="+instance+" & db2 list db directory\""; 
    
            // execute command and read output
            try{
                Process p = Runtime.getRuntime().exec(command);
                BufferedReader br= new BufferedReader(new InputStreamReader(p.getInputStream()));
                String op = null;
                while((op=br.readLine())!=null){
                    System.out.println(op);
                }
            }
            catch(IOException ioe){
                 ioe.printStackTrace();
             }
         }
    
          public void widgetDefaultSelected(SelectionEvent arg0) {}
    });
    

    问题是命令执行,我无法检索输出。窗口只是打开和关闭。

    我尝试过的一个解决方案是将输出重定向到临时文件并读取它。它工作正常,但效率很低,因为每次用户选择一个实例时都会运行这段代码。

    我在Windows XP SP3计算机上运行DB2 9.7 Enterprise Edition。

    有关如何在Java程序中检索输出的任何想法吗?

    提前多多感谢。

2 个答案:

答案 0 :(得分:1)

好的,想出这个。所需的解决方案是添加/ w和/ i切换到命令: -

 // command invokes db2 command window, sets current instance and issues list db command
 String command = "db2cmd /c /w /i \"set DB2INSTANCE="+instance+" & db2 list db directory\"";

根据IBM developerWorks

//  Additional information about db2cmd Options
-c  Execute the DB2 command window and terminate.
-w  Wait until the DB2 command window terminates.
-i  Inherit the environment from the invoking shell.
-t  Inherit the title from the invoking shell

答案 1 :(得分:1)

您还可以通过JNI使用DB2 API来检索数据库列表目录。您必须开始扫描,获取条目,然后关闭扫描。

通过执行此操作,您可以更好地控制数据库列表,解析可能因多种原因而变化的输出(HADR,身份验证机制,本地或远程,带或不带别名,IP地址或服务器名称,服务名称或端口号,在linux(家庭目录)或Windows(驱动器号),以及其他东西) DB2 API在所有平台上都是相同的,因此它几乎与平台无关,您只需要知道哪个库加载(.so或.dll),但其余的都是相同的。

有关更多信息,请查看: db2DbDirOpenScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001509.html db2DbDirGetNextEntry http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001492.html db2DbDirCloseScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001437.html