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

如何在不使用tnsnames.ora的情况下通过cx_Oracle连接OCM

通过Oracle连接管理器(OCM)连接Oracle数据库

我来帮你梳理下通过Oracle连接管理器(OCM)连接数据库的具体配置和代码实现,先从你熟悉的普通连接方式入手对比,这样更容易理解差异点:

一、普通非OCM连接方式(参考对比)

代码实现

直接构造连接字符串,用cx_Oracle.connect()即可:

# Oracle 普通连接
conn_str = 'user/password@host:port/service_name'
self.con = cx_Oracle.connect(conn_str)

对应的tnsnames.ora配置

这种方式对应的别名配置是:

db_alias = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = DatabaseHost)(PORT = DatabasePort))
    (CONNECT_DATA = (SERVICE_NAME = DatabaseService))
  )

二、通过OCM连接的配置与代码

当需要通过Oracle连接管理器(OCM)连接时,核心变化是在tnsnames.ora的配置里添加**SOURCE_ROUTE=YES**这个关键参数,同时要把OCM的地址和数据库的地址依次配置进去。

对应的tnsnames.ora配置示例

db_alias_with_ocm = 
  (DESCRIPTION =
    (SOURCE_ROUTE = YES)  # 这个是OCM连接的核心配置项
    (ADDRESS = (PROTOCOL = TCP)(HOST = OcmHost)(PORT = OcmPort))  # OCM的地址
    (ADDRESS = (PROTOCOL = TCP)(HOST = DatabaseHost)(PORT = DatabasePort))  # 目标数据库的地址
    (CONNECT_DATA = (SERVICE_NAME = DatabaseService))
  )

代码实现

有两种方式可以用这个配置连接:

  1. 如果你已经配置了tnsnames.ora且Oracle客户端能识别到(比如配置了TNS_ADMIN环境变量),可以直接用别名连接:
# 通过OCM连接(使用tns别名)
conn_str = 'user/password@db_alias_with_ocm'
self.con = cx_Oracle.connect(conn_str)
  1. 也可以直接在代码里写完整的描述字符串,不用依赖tnsnames.ora:
# 通过OCM连接(直接写完整描述)
conn_str = """user/password@(DESCRIPTION=(SOURCE_ROUTE=YES)
    (ADDRESS=(PROTOCOL=TCP)(HOST=OcmHost)(PORT=OcmPort))
    (ADDRESS=(PROTOCOL=TCP)(HOST=DatabaseHost)(PORT=DatabasePort))
    (CONNECT_DATA=(SERVICE_NAME=DatabaseService)))"""
self.con = cx_Oracle.connect(conn_str)

要注意的是,SOURCE_ROUTE=YES的作用是让Oracle客户端按照配置的地址顺序依次连接——先连OCM,再通过OCM连到目标数据库,这是OCM连接的关键所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:45:35