我在通过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类的“实例”参数),该连接被拒绝。参数已正确传递给构造函数,但就像脚本不断看到第一个钱包一样,该钱包显然包含其他服务的user / pwd。
如何克服这种“持久性”?
答案 0 :(得分:0)
Oracle仅读取其环境变量(包括TNS_ADMIN和NLS_LANG之类的变量)。建立连接后,将不再查询环境变量。这可能是您看到的“持久性”的来源。您需要确保在建立连接之前已定义所有环境变量,并且这些环境变量适用于您打算建立的所有连接。否则,您将需要使用某种子进程(但不能使用fork创建)。