树莓派Python用JDBC连接Oracle时线程无异常终止问题求助
问题:树莓派Python通过JDBC连接Oracle时线程意外终止且无异常日志
在树莓派上用Python开发,通过JDBC连接Oracle数据库,遇到的问题是:JDBC连接过程中有时线程会意外关闭。代码里已经加了try-except异常捕获,但线程终止时没留下任何异常日志,没法定位原因,怀疑是不是JDBC的使用问题?
根据留存日志,线程在执行self.logger.debug("%s, ret: %s, %s" % (msg, str(ret), str(time.time() - t1)))之前就已经终止。
相关代码
def connect_A_db(self): print('Connect a oracle.db\n') try : start_time = time.time() conn = jaydebeapi.connect("oracle.jdbc.driver.OracleDriver", dsn, [user, password], jdbc_path) period = (time.time() - start_time) print("conn_period: " + str(period)) return conn except Exception as ex: period = (time.time() - start_time) print("conn_period: " + str(period)) print(str(ex)) return -1 def A_client_function_send_data(self, msg): ret = -1 try : print("start conn") t1 = time.time() conn = self.connect_A_db() if conn != -1: cursor = conn.cursor() cursor.execute(msg) ret = 0 if isinstance(conn, jaydebeapi.Connection): conn.commit() conn.close() print("%s" %(msg)) self.logger.debug("%s, ret: %s, %s" %(msg, str(ret), str(time.time() - t1))) else: ret = -1 except jaydebeapi.DatabaseError as e: print(f"Insert Error: {e}") self.logger.error(f"Insert Error: {e}") conn.rollback() except Exception as ex: self.exh.systemError(traceback.format_exc()) self.logger.error("Exception: " + str(ex)) print(ex) ret = -1 finally : print("send ret: "+ str(ret)) return ret
排查方向与修复建议
- 未捕获的底层异常:如果是JVM层面崩溃、系统信号(比如OOM killer杀进程)导致的线程终止,Python的try-except根本抓不到。这种情况去树莓派的
/var/log/syslog里找系统级日志,看有没有段错误、内存不足的记录。 - 资源释放步骤漏捕获:代码里
conn.commit()和conn.close()放在if块里,没被外层try-except覆盖。如果这两步抛出异常,直接会终止线程且不打日志。把这部分单独加try-except:if isinstance(conn, jaydebeapi.Connection): try: conn.commit() conn.close() print("Commit and close done") self.logger.debug("Commit and close done") except Exception as close_err: self.logger.error(f"Commit/Close failed: {close_err}") print(f"Commit/Close failed: {close_err}") print(f"{msg}") self.logger.debug(f"{msg}, ret: {str(ret)}, {str(time.time() - t1)}") - 全局异常兜底:给线程加全局异常捕获,抓所有漏网的异常:
import sys import traceback def global_exception_handler(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return self.logger.error("Uncaught error:", exc_info=(exc_type, exc_value, exc_traceback)) print("Uncaught error:\n", traceback.format_exc()) sys.excepthook = global_exception_handler - 加细粒度调试日志:在
conn.commit()、conn.close()前后都加打印和日志,确认哪一步触发了终止:print("Starting commit...") conn.commit() print("Commit finished, starting close...") conn.close() print("Close finished")
内容的提问来源于stack exchange,提问作者BiBi
相关产品推荐
相关产品推荐

