Добавление файла jar в jpype приводит к сбою java - PullRequest
0 голосов
/ 04 января 2019

Я использую flask-appbuilder для создания приложения. Чтобы отправить форму для выполнения ddl, я добавляю jar-файл в jpype при запуске startJVM (), но java всегда вылетает. Ниже мой код:

import jaydebeapi
from flask import flash

def execute_ddl(dic):
    def set_up_conn(dic):
        conn = jaydebeapi.connect(jclassname=dic['jclass'],
                              url=dic['url'],
                              driver_args=[dic['driver_name'], 
                              dic['driver_params']],
                              jars=dic['jars'])
        curs = conn.cursor()
        curs.execute(dic['ddl'])
        output = curs.fetchall()
        print(output)
        curs.close()
        conn.close()
    try:
        import jpype
        if not jpype.isJVMStarted():
            jvmPath = jpype.getDefaultJVMPath()
            flash(str(jvmPath), 'info')
            jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=/lib/uber-hive-jdbc-1.2.1.jar")

        if not jpype.isThreadAttachedToJVM():
            jpype.attachThreadToJVM()
            jpype.java.lang.Thread.currentThread().\
         setContextClassLoader(jpype.java.lang.ClassLoader.getSystemClassLoader())
        set_up_conn(dic)
        # post process form
        flash('{} is submitted!'.format(dic['ddl']), 'info')
    except Exception as e:
        flash(str(e), 'info')

Это ошибка сбоя, и я попытался "ulimit -c unlimited", но безуспешно.

# A fatal error has been detected by the Java Runtime Environment:
#  
#  SIGSEGV (0xb) at pc=0x00007fce15f978b9, pid=12, tid=0x00007fce0f7fe700
#
# JRE version: OpenJDK Runtime Environment (8.0_181-b13) (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
# Java VM: OpenJDK 64-Bit Server VM (25.181-b13 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [_jpype.cpython-37m-x86_64-linux-gnu.so+0x3f8b9]  
JPJavaEnv::NewLocalRef(_jobject*)+0x9
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# //hs_err_pid12.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp

1 Ответ

0 голосов
/ 28 марта 2019

Я использовал multi_threading, что является причиной.

Jaydebeapi использует jpype для запуска JVM. Вам нужно использовать jpype.attachThreadToJVM() в теле потока, чтобы JVM могла использоваться из этого потока. Вы можете использовать jpype.isThreadAttachedToJVM(), чтобы проверить, прикреплено ли оно.

...