Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python启动java程序时';s subprocess.Popen()退出,为什么子进程打开的数据库连接没有关闭?_Java_Python_Jython - Fatal编程技术网

使用Python启动java程序时';s subprocess.Popen()退出,为什么子进程打开的数据库连接没有关闭?

使用Python启动java程序时';s subprocess.Popen()退出,为什么子进程打开的数据库连接没有关闭?,java,python,jython,Java,Python,Jython,我们使用Robot框架实现测试自动化,我们的jython测试代码使用subprocess.Popen()生成一个java子流程: Java代码利用到Oracle数据库的JDBC连接,同一程序需要连续执行多次 我们的问题是,在java程序退出后,到Oracle的数据库连接没有关闭——在多次执行之后,测试开始失败,因为Oracle不会接受更多的连接 netstat显示,到Oracle的陈旧TCP连接属于jython的PID(=父进程) 当java程序(=子进程)退出时,为什么连接没有关闭?我不确定,

我们使用Robot框架实现测试自动化,我们的jython测试代码使用subprocess.Popen()生成一个java子流程:

Java代码利用到Oracle数据库的JDBC连接,同一程序需要连续执行多次

我们的问题是,在java程序退出后,到Oracle的数据库连接没有关闭——在多次执行之后,测试开始失败,因为Oracle不会接受更多的连接

netstat显示,到Oracle的陈旧TCP连接属于jython的PID(=父进程)


当java程序(=子进程)退出时,为什么连接没有关闭?

我不确定,但有可能因为您使用的是Jython,解释器被赋予了连接的所有权(因此它们会一直存在到该进程结束)。您是否尝试过在
进程.wait()
之后使用
进程.terminate()

我不确定,但有可能因为您使用的是Jython,解释器获得了连接的所有权(因此它们会一直存在到该进程终止为止)。您是否尝试过在
进程.wait()
之后使用
进程.terminate()

考虑使用os.kill(由process.terminate in>=2.6使用)

如果这不起作用,考虑到您的异常设置(JVM调用JVM,这通常不是必需的),您可能需要使用类似execnet()的东西来启动一个CPython进程来控制它。与Jython中提供的功能相比,CPython具有更多访问主机操作系统服务的功能。使用execnet是将这些优势结合在一起的好方法。

考虑使用os.kill(process.terminate in>=2.6使用)


如果这不起作用,考虑到您的异常设置(JVM调用JVM,这通常不是必需的),您可能需要使用类似execnet()的东西来启动一个CPython进程来控制它。与Jython中提供的功能相比,CPython具有更多访问主机操作系统服务的功能。使用execnet是将这些优点结合在一起的好方法。

我还想知道进程是否在同一内存空间中运行,即它是一个线程,而不是一个完全独立的进程。这意味着,在清理完整个内存空间之前,操作系统不会关闭连接,也就是说,整个进程都结束了。我忘了提到,我们使用的是python 2.5,它没有进程。terminate()您可以尝试
del(进程)
虽然我不知道这是否有帮助。我还想知道进程是否在同一内存空间中运行,即它是一个线程,而不是一个完全独立的进程。这意味着,在清理完整个内存空间之前,操作系统不会关闭连接,也就是说,整个进程都死掉了。我忘了提到,我们使用的是python 2.5,它没有进程。terminate()您可以尝试
del(进程)
,但我不知道这是否有帮助。当JVM子进程在Jython下执行时,pid()返回None。当使用execnet启动Python解释器,而Python解释器又执行第二个JVM时(我知道这并不必要),所有套接字仍然属于第一个JVM。好吧,真正的问题是插座一开始并没有关闭。因此,只使用一个JVM将是最好的解决方案。当JVM子流程在Jython下执行时,process.pid()返回None。当使用execnet启动Python解释器,而Python解释器又执行第二个JVM时(我知道这并不必要),所有套接字仍然属于第一个JVM。好吧,真正的问题是插座一开始并没有关闭。因此,只使用一个JVM将是最好的解决方案。
    cmd = "java -jar program.jar"
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    process.wait()