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

Python oracledb.connect挂起但本地Oracle客户端可正常连接的问题求助

Python oracledb.connect挂起但本地Oracle客户端可正常连接的问题求助

各位好,我碰到一个棘手的问题想请教大家:

我尝试用oracledb库连接Oracle数据库,严格按照官方文档的步骤编写代码,但执行到with oracledb.connect这一行时就直接挂起,完全没有后续输出。但奇怪的是,本地用Oracle的SQL*Plus客户端却能正常连接并执行查询;而且把这段代码放到防火墙后方的主机上(移除代理配置),就能立刻运行成功。我怀疑问题和tnsnames.ora里的代理设置有关,但已经在连接参数里显式指定了代理相关配置,还是没能解决问题。

以下是我的测试代码:

#!/usr/bin/env python3
import os
import oracledb

un = os.environ["USER"]
pw = os.environ["PASSWORD"]
tns_entry = os.environ["TNS_ENTRY"]
config_dir = f'{os.environ["PWD"]}/wallets/test/'

print("USERNAME:", un)
print("PASSWORD:", pw)
print("TNS_ENTRY:", tns_entry)
print("TNS_ADMIN:", config_dir)

with open(config_dir+"/tnsnames.ora","r") as f:
    print(f.read())

with open(config_dir+"/sqlnet.ora","r") as f:
    print(f.read())

with oracledb.connect(
    user=un,
    password=pw,
    dsn=tns_entry,
    config_dir=config_dir,
    wallet_location=config_dir
) as connection:
    with connection.cursor() as cursor:
        sql = "select systimestamp from dual"
        for (r,) in cursor.execute(sql):
            print(r)

运行这段代码后,到挂起前的输出内容:

-> % ./dbtest.py                         
USERNAME: sreapp
PASSWORD: ***
TNS_ENTRY: medium
TNS_ADMIN: /Users/cbongior/dev/oracle/fleetman/wallets/test/
medium = (description= (retry_count=2)(retry_delay=3)(address=(https_proxy=100.92.6.113)(https_proxy_port=3128)(protocol=tcps)(port=1522)(host=zxqgy1nz.adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=gea38c0017d364a_sreadwt1_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=no)))
SQLNET.USE_HTTPS_PROXY=on
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
SSL_SERVER_DN_MATCH=no

我在控制台用SQL*Plus做了同样的参数验证,完全能正常连接并查询:

-> % echo $USER
sreapp
(.venv) cbongior@cbongior-mac [16:21:49] [~/dev/oracle/fleetman] [main *]
-> % echo $PASSWORD
****
(.venv) cbongior@cbongior-mac [16:21:54] [~/dev/oracle/fleetman] [main *]
-> % echo $TNS_ENTRY
medium
(.venv) cbongior@cbongior-mac [16:22:05] [~/dev/oracle/fleetman] [main *]
-> % echo $TNS_ADMIN
/Users/cbongior/dev/oracle/fleetman/wallets/test
(.venv) cbongior@cbongior-mac [16:22:21] [~/dev/oracle/fleetman] [main *]
-> % echo $TNS_ADMIN
(.venv) cbongior@cbongior-mac [16:22:32] [~/dev/oracle/fleetman] [main *]
-> % cat $TNS_ADMIN/tnsnames.ora
medium = (description= (retry_count=20)(retry_delay=3)(address=(https_proxy=100.92.6.113)(https_proxy_port=3128)(protocol=tcps)(port=1522)(host=zxqgy1nz.adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=gea38c0017d364a_sreadwt1_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=no)))
[main *]
-> % cat $TNS_ADMIN/sqlnet.ora
SQLNET.USE_HTTPS_PROXY=on
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
SSL_SERVER_DN_MATCH=no%    



(.venv) cbongior@cbongior-mac [16:22:40] [~/dev/oracle/fleetman] [main *]
-> % sqlplus "${USER}/${PASSWORD}@${TNS_ENTRY}" <<< "select systimestamp from dual; 
exit;"


SQL*Plus: Release 19.0.0.0.0 - Production on Tue Mar 25 16:21:01 2025
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Last Successful login time: Tue Mar 25 2025 16:19:30 -07:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.1.0

SQL> 
SYSTIMESTAMP
---------------------------------------------------------------------------
25-MAR-25 11.21.04.273828 PM +00:00

SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.1.0
(.venv) cbongior@cbongior-mac [16:21:05] [~/dev/oracle/fleetman] [main *]

另外,把代码放到防火墙后方的主机(移除代理配置),运行完全正常,输出如下:

|main ↑7 S:4 U:3 ?:6 ✗| → dbtest.py 
/home/cbongior/.local/lib/python3.6/site-packages/oracledb/__init__.py:39: UserWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in python-oracledb and will be removed in a future release
  warnings.warn(message)
USERNAME: sreapp
PASSWORD: ****
TNS_ENTRY: medium
TNS_ADMIN: /home/cbongior/dev/oracle/fleetman/wallets/test/
medium = (description= (retry_count=2)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=zxqgy1nz.adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=gea38c0017d364a_sreadwt1_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=no)))

SQLNET.USE_HTTPS_PROXY=off
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
SSL_SERVER_DN_MATCH=no

2025-03-27 00:13:06.250068

我已经确认代理参数正确,而且客户端能正常走代理连接,但oracledb就是挂起不动,有没有朋友遇到过类似的问题?麻烦帮忙看看可能的原因,谢谢!

备注:内容来源于stack exchange,提问作者Christian Bongiorno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:48:03