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

使用Python结合cx_Oracle执行INSERT语句时程序无限卡顿的解决方法

解决cx_Oracle执行INSERT语句卡顿问题

针对你遇到的SELECT正常但INSERT卡顿的情况,可从以下几个方向排查解决:

  • 修正参数传递格式
    你的execute方法参数传递存在冗余嵌套,原代码中([self.usuario_os,self.usuario_os,self.cd_var11,xvar])的外层括号属于多余写法,可能导致参数解析异常。建议改为直接传递元组或列表:

    # 使用元组(推荐)
    self.cursor.execute(query, (self.usuario_os, self.usuario_os, self.cd_var11, xvar))
    # 或直接使用列表
    self.cursor.execute(query, [self.usuario_os, self.usuario_os, self.cd_var11, xvar])
    
  • 避免重复创建数据库连接
    每次执行INSERT都调用connect()重新创建连接和游标,会导致数据库连接资源频繁创建销毁,易引发会话等待或锁冲突。建议将连接初始化放在类的构造方法__init__中,而非每次插入时调用:

    def __init__(self):
        # 其他初始化逻辑
        self.connect()
    
    def insert_ControleExecucao(self, xvar):
        query = """INSERT INTO table (DT_var1, CD_var1, DT_var2, CD_var2, CD_var3, CD_var4, DT_var3)
            values (sysdate,:1, sysdate,:2,:3,:4,sysdate)"""
        self.cursor.execute(query, (self.usuario_os, self.usuario_os, self.cd_var11, xvar))
        self.conn.commit()
    
  • 检查数据库端锁状态
    程序卡顿期间,登录Oracle数据库执行以下SQL,查看当前会话的等待事件,确认是否存在锁等待:

    SELECT sid, serial#, wait_class, event, sql_text 
    FROM v$session s
    JOIN v$sql sql ON s.sql_id = sql.sql_id
    WHERE s.username = '你的数据库用户名';
    

    如果发现存在enq: TX - row lock contention等锁等待事件,说明有其他会话占用了目标表的行锁,需要排查其他操作或释放锁。

  • 启用cx_Oracle调试日志
    开启调试日志可以追踪执行过程的细节,定位卡顿环节:

    import cx_Oracle
    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    # 初始化Oracle客户端时开启调试,需指定客户端路径
    cx_Oracle.init_oracle_client(lib_dir=r"C:\path\to\oracle\client", debug=True)
    
  • 验证Oracle客户端兼容性
    cx_Oracle 8.0.1需要搭配兼容的Oracle客户端版本(推荐12c R2或19c),Windows 7系统下需确保客户端已正确安装,且ORACLE_HOME和PATH环境变量配置正确,避免因客户端不兼容导致的底层通信异常。

内容的提问来源于stack exchange,提问作者Anderson Carvalho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:45:37