我们使用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
答案 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