使用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
相关产品推荐
相关产品推荐

