首页 > 解决方案 > 我可以在 oracle tns 连接字符串中为不同地址指定用户名和密码吗?

问题描述

背景: 使用 Oracle 12cR2 数据库,在这个特定的解决方案中,我们需要最大的可用性。我们在 Golden Gate 中使用主动-主动复制。设置本地用户进行身份验证。我们将客户端设置为能够无缝地进行故障转移并能够进行身份验证,我们已经手动同步了跨数据库实例的同一逻辑用户的密码。

问题陈述: 有没有办法出现客户端故障(如下所示),但能够指定主数据库和辅助数据库的用户凭据?

我们的凭据目前是通过 PoolDataSource 上的 setter 进行的,我还没有找到可以为用户名/密码设置的 TNS 字符串属性。

    PoolDataSource poolDataSource = (PoolDataSourceImpl) PoolDataSourceFactory.getPoolDataSource();
    poolDataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
    poolDataSource.setURL(url);
    poolDataSource.setUser(username);
    poolDataSource.setPassword(password);
    ...

在客户端,我们使用 ojdbc8、ucp 和 ons jar:

    <dependency>
      <groupId>com.oracle.database</groupId>
      <artifactId>ojdbc8</artifactId>
      <version>12.2.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ucp</artifactId>
      <version>12.1.2-0-0</version>
    </dependency>
    <dependency>
      <groupId>com.oracle.weblogic</groupId>
      <artifactId>ons</artifactId>
      <version>12.1.2-0-0</version>
    </dependency>

这就是我们的连接字符串的样子:

dbc:oracle:thin:@(
  DESCRIPTION_LIST=(LOAD_BALANCE=off)(FAILOVER=on)

  (DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
  (ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=${primaryHostname)(PORT=1521)))
  (CONNECT_DATA=(SERVICE_NAME=${primaryServiceName)))

  (DESCRIPTION=
  (ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=${secondaryHostname })(PORT=1521)))
  (CONNECT_DATA=(SERVICE_NAME=${secondaryServiceName})))
)

标签: oraclejdbcoracle12cucp

解决方案


tns(我的意思是整个透明网络基板,而不仅仅是 'tnsnames.ora)只关心通过网络将消息传递到 oracle 数据库。它不知道也不关心用户的数据库凭据。事实上,当凭据被提交给数据库时,TNS 已经完成了它的工作,并且已经被排除在外了。TNS 将请求传递给侦听器。根据请求的内容,侦听器(a)生成一个专用的服务器进程并告诉客户端使用哪个端口与该服务器直接通信,或者(b)找到一个可用的调度程序并告诉客户端使用哪个端口进行通信直接与该调度员联系。一旦完成,侦听器就不在画面中了,它要么是专用服务器,要么是向数据库提供凭据的调度程序。


推荐阅读