如何在不使用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)) )
代码实现
有两种方式可以用这个配置连接:
- 如果你已经配置了
tnsnames.ora且Oracle客户端能识别到(比如配置了TNS_ADMIN环境变量),可以直接用别名连接:
# 通过OCM连接(使用tns别名) conn_str = 'user/password@db_alias_with_ocm' self.con = cx_Oracle.connect(conn_str)
- 也可以直接在代码里写完整的描述字符串,不用依赖
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
相关产品推荐
相关产品推荐

