我在通过cx_Oracle模块更改数据库服务时遇到一些问题。
似乎第一个连接“持续存在”,即使删除对象或在子进程中创建新连接。因此,当我尝试连接到另一个服务时,会引发“ORA-01017:用户名/密码无效;登录被拒绝”
我用钱包来安排连接。
class Connection(object):
def __init__(self,oracle_user,instance=os.environ["ORACLESRV"],env=os.environ["ENVPURPOSE"]):
self.oracle_user = oracle_user
self.instance = instance
self.env = env
wallet_path = "$SCRIPTS/oracle/wallets/{env}/{oracle_user}".format(env=self.env.upper(),oracle_user=self.oracle_user.upper())
os.environ["TNS_ADMIN"] = os.path.expandvars(wallet_path)
os.environ["NLS_LANG"] = "Italian_Italy.UTF8"
self.connection = cx_Oracle.connect("/@"+self.instance.upper())
第一个连接没有错误,但是当我尝试更改服务(即Connection类的“instance”参数)时,连接被拒绝。参数被正确传递给构造函数,但它就像脚本一直看到第一个钱包,显然包含另一个服务的user / pwd。
我怎样才能克服这种“持久性”?
Oracle只读取一次环境变量 - 包括TNS_ADMIN和NLS_LANG之类的环境变量。建立连接后,不再查询环境变量。这可能是您所看到的“持久性”的根源。您需要确保在建立连接之前已经定义了环境变量,并且这些变量适用于您打算进行的所有连接;否则,您将需要使用某种子进程(但不使用fork创建)。