Когда java-программа запускается с использованием подпроцесса Python. Выход из Popen (), почему соединение с базой данных, открытое подпроцессом, не закрывается? - PullRequest
0 голосов
/ 13 августа 2010

Мы используем Robot Framework для автоматизации тестирования, и наш тестовый код jython порождает подпроцесс java с использованием subprocess.Popen ():

    cmd = "java -jar program.jar"
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    process.wait()

В коде Java используется соединение JDBC с базой данных Oracle, и одну и ту же программу необходимо выполнить несколько раз подряд.

Наша проблема в том, что после завершения работы java-программы соединение с базой данных не закрывается - и после нескольких выполнений тесты начинают давать сбои, поскольку Oracle не принимает больше соединений.

netstat показывает, что устаревшие TCP-соединения с Oracle принадлежат PID jython (= родительский процесс).

Почему соединения не закрываются при выходе из java-программы (= подпроцесс)?

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Я не уверен, но возможно, что из-за того, что вы используете Jython, интерпретатору предоставляется право собственности на соединения (и, следовательно, они выживают до тех пор, пока этот процесс не прекратится).Вы пытались использовать process.terminate() после process.wait()?

1 голос
/ 17 августа 2010

Рассмотрите возможность использования os.kill (который используется process.terminate в> = 2.6).

Если это не сработает, учитывая вашу необычную настройку - JVM, вызывающие JVM, обычно не нужны - вы можетеЯ хочу использовать что-то вроде execnet (http://codespeak.net/execnet/), чтобы запустить процесс CPython для управления этим. CPython имеет больше возможностей для доступа к службам операционной системы хоста, чем то, что мы предоставили в Jython. Использование execnet - хороший способ объединить эти преимуществавместе.

...