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

Python连接远程Oracle数据库时futex()系统调用超时问题排查

Python cx_Oracle连接Oracle时futex()超时问题排查

我执行以下Python代码连接远程Oracle数据库服务器时,发现futex()系统调用超时,导致数据库连接耗时异常(约10秒后才成功连接并返回结果)。但用Node.js测试同一数据库连接时,未出现该futex()超时情况,此问题仅在Python代码中出现,请问可能的原因是什么?

执行的Python代码

import cx_Oracle

dsn_tns=cx_Oracle.makedsn('dbhost','port',service_name='SERVICENAME')
conn = cx_oracle.connect(user=r'USER_NAME',password='******',dsn=dsn_tns)
c = conn.cursor()
c.execute("""SIMPLE SELECT QUERY""")
for row in c;
    print (row[0],'-',row[1])
conn.close

排查使用的命令

strace python3.6 dbtest.py

超时的系统调用

futex(0x56413124c9c8, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, {tv_sec+1671793111, tv_nsec=5000000}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEOUT (Connection timed out)

可能的原因分析

  • cx_Oracle与Oracle客户端库版本不兼容:cx_Oracle依赖Oracle Instant Client,若两者版本不匹配,会导致内部线程同步逻辑出现futex等待超时。Node.js的Oracle驱动(如oracledb)可能使用了不同的客户端库版本或初始化逻辑,避开了该问题。
  • Python GIL与Oracle客户端线程冲突:Python的全局解释器锁(GIL)在处理Oracle客户端的线程操作时可能引发阻塞,导致futex调用等待超时。Node.js的事件循环模型无GIL限制,因此不受影响。
  • DNS解析或网络配置差异:cx_Oracle解析DB主机名时可能采用了不同的DNS策略,引发内部等待。可尝试用IP地址代替主机名测试,验证是否解决超时问题。
  • 代码语法错误的间接影响:你的代码存在几处语法问题:
    • cx_oracle.connect应为cx_Oracle.connect(模块名大小写错误)
    • for row in c;中的分号需改为冒号:
    • conn.close缺少括号,应为conn.close()
      若实际运行的是修正后的代码,仍需排查其他因素。
  • Oracle客户端配置参数问题:比如sqlnet.ora中的SQLNET.RECV_TIMEOUT或SQLNET.SEND_TIMEOUT设置不合理,cx_Oracle继承了这些配置,而Node.js驱动可能忽略或使用了不同默认值,可检查该配置文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:45:27