Python 2.7 Многопоточный DB-Connection аварийно завершает работу - PullRequest
0 голосов
/ 05 июня 2018

Мы используем cx_Oracle для подключения нескольких потоков к базе данных и выпускаем различные выборки и обновления.Однако по неизвестным причинам сценарий убивается системой при случайных подключениях к базе данных.В системном журнале или файлах сообщений нет никакой информации.

Из-за обработки ошибок мы пытаемся записать трассировки в файл журнала.К сожалению, у нас нет информации о сбое скрипта в лог-файле.Только в stdout распечатка с «PID kill» в последней строке.

Может ли быть проблема в одновременном соединении базы данных с несколькими потоками?В то же время выполняются и другие сценарии, которые также взаимодействуют с базой данных (не многопоточные), но обращаются к другим таблицам.

Это наша функция, которая вызывается для каждого выбора.Для обновлений у нас есть другие функции.

def ora_send_sql( logger, statement):
    try:
        dsn = cx_Oracle.makedsn(SQL_IP, SQL_PORT, SQL_SID)
        con = cx_Oracle.connect(SQL_USR, SQL_PWD, dsn)
        cur = con.cursor()
        cur.execute(statement)
        con.commit()
        con.close()
        return 0
    except cx_Oracle.Warning as w:
        logger.warning(" Oracle-Warning: "+ str(e).strip())
        pass
    except cx_Oracle.Error as e:
        error, = exc.args
        logger.error(" Oracle-Error-Code:", error.code)
        logger.error(" Oracle-Error-Message:", error.message)
        return -1
    except:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        logger.exception(" Got Traceback in ora_send_sql: " + str(exc_type) + " Fname=" + str(fname) + " Lineno=" + str(exc_tb.tb_lineno))
        return -2

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Я думаю, что мы исправили проблему, обновив cx_Oracle до последней версии.Они исправили несколько утечек памяти в обновлениях .....

Но это все еще не объясняет, почему мы не видим никакой информации об убийстве ....

0 голосов
/ 06 июня 2018

Вы почти наверняка должны использовать threaded=True в вызове connect(), см. http://cx -oracle.readthedocs.io / en / latest / module.html # cx_Oracle.Connection

0 голосов
/ 05 июня 2018

Я не думаю, что вы пытались включить исключение: в исключение как e, а затем пытались увидеть, является ли исключение чем-то особенным.Возможно, еще одна возможная вещь, которую можно попробовать - полностью удалить обработку исключения и дать ему сбои, а затем исследовать вывод.Таким образом, вы могли бы определить фактическое исключение, которое выдается, потому что я просто не могу поверить, что оно просто "вылетит"Наконец, попробуйте исследовать dmesg для любых ошибок.

...