Python 2.7多线程DB-Connection随机崩溃

时间:2018-06-05 07:08:22

标签: python multithreading cx-oracle

我们使用cx_Oracle将多个线程连接到数据库并发出各种选择和更新。 但是,由于未知原因,系统会在随机数据库连接上杀死该脚本。 syslog或messages-files中没有信息。

由于错误处理,我们尝试在日志文件中编写回溯。不幸的是,我们没有关于脚本在日志文件中崩溃的信息。只有在stdout中才会打印出" PID被杀死"在最后一行。

同时使用多个线程建立数据库连接会有问题吗?还有其他脚本同时运行,它们也与数据库通信(不是多线程),但访问其他表。

这是我们为每个选择调用的函数。对于更新,我们有其他功能。

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 :(得分:0)

我不认为你试过转向除了:除了Exce为e之外,然后试图查看异常是否有点特殊。另一个可能的尝试可能是完全删除异常处理并让它崩溃,然后调查输出。这样你就可以发现抛出的实际异常,因为我简直无法相信它会“崩溃”。最后,尝试调查dmesg以查找任何段错误。

答案 1 :(得分:0)

我认为我们已经通过将cx_Oracle更新到最新版本来解决了这个问题。 他们在更新中修复了一些内存泄漏......

但这仍然无法解释为什么我们没有看到有关杀戮的任何信息......

答案 2 :(得分:0)

您几乎肯定需要在threaded=True来电中使用connect(),请参阅http://cx-oracle.readthedocs.io/en/latest/module.html#cx_Oracle.Connection