背景:使用Oracle 12cR2数据库,在此特定解决方案中,我们需要最大的可用性。我们正在将Active-Active复制与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})))
)
tns(我的意思是整个透明网络基质,而不仅仅是'tnsnames.ora)仅与通过网络将消息传递到oracle数据库有关。它不知道或不在乎用户的数据库凭据。实际上,在将凭据提供给数据库时,TNS已经完成了其工作,并且已经无法使用。 TNS将请求传递给侦听器。根据请求的内容,侦听器(a)生成专用的服务器进程并告诉客户端使用哪个端口直接与该服务器进行通信,或者(b)找到可用的调度程序并告诉客户端使用哪个端口进行通信直接与该调度员联系。完成此操作后,侦听器将无法使用,它是向数据库提供凭据的专用服务器或调度程序。