Python 2.7 多线程数据库连接随机崩溃

Python 2.7 Multi-threaded DB-Connection crashes randomly

我们使用 cx_Oracle 将多个线程连接到数据库并发出各种 select 和更新。 但是,由于未知原因,该脚本在随机数据库连接时被系统终止。系统日志或消息文件中没有信息。

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

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

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

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

我想您不会尝试将 except: 转换为 except Exception as e,然后尝试查看该异常是否有些特殊。另一个可能尝试的事情是完全删除异常处理并让它崩溃,然后调查输出。这样你就可以发现抛出的实际异常,因为我简直不敢相信它会 "crash"。最后,尝试调查 dmesg 是否存在任何段错误。

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

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

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