You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:21