Как получить выходные данные команды db2 из Java-программы - PullRequest
0 голосов
/ 06 марта 2012

Я не могу получить вывод команды "db2 list db directory" в моей Java-программе. По сути, я пытаюсь сделать следующее: -

  1. Поле со списком заполняется экземплярами db2 в локальной системе
  2. Пользователь выбирает конкретный экземпляр из поля со списком
  3. Запущен новый процесс для просмотра базы данных для этого экземпляра
  4. Показать базу данных как еще одно поле со списком

Это фрагмент кода, который я сделал: -

// 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) {}
});

Проблема в том, что команда выполняется, я не могу получить вывод. Окно просто открывается и закрывается.

Одним из решений, которое я попытался, было перенаправить вывод во временный файл и прочитать его. Это работает, но довольно неэффективно, поскольку этот фрагмент кода запускается каждый раз, когда пользователь выбирает экземпляр.

Я использую DB2 9.7 Enterprise edition на компьютере с Windows XP SP3.

Есть мысли о том, как получить выходные данные в программе Java?

Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вы также можете использовать API DB2 через JNI для получения каталога списка базы данных.Вы должны запустить сканирование, получить записи, а затем закрыть сканирование.

Таким образом вы можете лучше управлять списком БД, анализируя выходные данные, которые могут варьироваться по многим причинам (HADR,механизм аутентификации, локальный или удаленный, с или без псевдонима, IP-адреса или имени сервера, имени службы или номера порта, в linux (home dir) или в Windows (буква диска) и другие). API DB2 одинаков вна всех платформах, так что он практически независим от платформы, вам просто нужно знать, какая библиотека загружена (.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

1 голос
/ 06 марта 2012

Хорошо, понял это. Требуемое решение - добавить ключи / 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...