DPY-3008错误排查:python-oracledb执行SQL报错Toad正常
解决python-oracledb执行SQL时DPY-3008错误的思路
定位错误根源:错误中的
2396对应Oracle原生错误ORA-02396,即会话超出最大空闲时间限制。python-oracledb的DPY-3008是因为无法处理Oracle返回的这类带内通知,而Toad的会话配置或处理逻辑避开了这个问题。检查会话资源限制:
- 查询当前用户的会话资源配置,确认是否存在
IDLE_TIME或CONNECT_TIME的限制:SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name IN ('IDLE_TIME', 'CONNECT_TIME') AND profile = (SELECT profile FROM dba_users WHERE username = USER); - 若存在限制,要么优化查询缩短执行时间(比如添加索引、简化逻辑),要么联系DBA调整对应profile的资源阈值。
- 查询当前用户的会话资源配置,确认是否存在
调整python-oracledb连接参数:
- 创建连接时关闭事件通知功能,避免触发带内通知处理:
connection = oracledb.connect( user="your_username", password="your_password", dsn="your_dsn", events=False ) - 调整查询预取行数,减少会话空闲时间:
cursor.execute("your_target_query", prefetchrows=1000)
- 创建连接时关闭事件通知功能,避免触发带内通知处理:
临时放宽会话限制:
- 若有权限,在执行目标查询前临时修改当前会话的空闲时间限制:
ALTER SESSION SET IDLE_TIME = UNLIMITED; - 执行完查询后可恢复原配置(若需要)。
- 若有权限,在执行目标查询前临时修改当前会话的空闲时间限制:
升级python-oracledb版本:旧版本可能存在带内通知处理的bug,升级到最新版本尝试解决:
pip install --upgrade python-oracledb对齐Toad的会话环境:
- 在Toad中执行
SELECT * FROM v$session WHERE sid = (SELECT sid FROM v$mystat WHERE rownum=1);获取会话参数,然后在Python脚本中设置相同参数:cursor.execute("ALTER SESSION SET PARAMETER_NAME = 'TOAD_PARAM_VALUE'")
- 在Toad中执行
内容的提问来源于stack exchange,提问作者Atacan
相关产品推荐
相关产品推荐

