Windows10下Python用cx_Oracle连Oracle报ORA-03135错误求助
结合你描述的情况(sqlplus和tnsping正常、防火墙已排除、sqlnet.ora参数调整无效),分享几个我实际排查过这类问题的有效方向:
确认cx_Oracle与Oracle客户端版本兼容性
这是最容易踩的坑:cx_Oracle的版本必须和你安装的Oracle Instant Client(或本地Oracle客户端)主版本匹配。比如用Oracle 19c客户端就不能装cx_Oracle 8.x以下版本;要是Oracle 11g客户端,cx_Oracle最高只能用到7.3.x版本。
你可以先打印当前cx_Oracle版本:import cx_Oracle print(cx_Oracle.version)对照官方版本兼容矩阵确认后,卸载不匹配版本重新安装:
pip uninstall cx_Oracle pip install cx_Oracle==[对应兼容版本号]检查Oracle客户端环境变量配置
Windows下要确保Oracle Instant Client路径已加入系统PATH,且放在可能冲突的路径(比如其他软件自带的旧Oracle组件路径)前面。同时配置好以下变量:ORACLE_HOME:指向Oracle客户端安装目录(例:C:\instantclient_19_12)TNS_ADMIN:指向包含tnsnames.ora和sqlnet.ora的目录,若文件在客户端network\admin下,可设为%ORACLE_HOME%\network\admin
尝试跳过makedsn,直接用连接字符串
有时候makedsn生成的DSN会有隐藏问题,试试更直接的连接方式:import cx_Oracle conn = cx_Oracle.connect('username/passwd@host:port/service_name')调整服务器端sqlnet.ora配置
你只修改了本地客户端的配置,但服务器端参数也会影响连接。建议把服务器端的SQLNET.INBOUND_CONNECT_TIMEOUT从3秒调至60秒(太短容易触发超时),同时确保服务器端也配置了SQLNET.EXPIRE_TIME=10,保持两端参数一致。验证Python与Oracle客户端位数匹配
64位Python必须搭配64位Oracle Instant Client,32位Python则用32位客户端,位数不匹配必然出现连接故障。你可以通过python --version查看位数(输出里的AMD64代表64位)。
内容的提问来源于stack exchange,提问作者akei9

