我已经读过我可以设置JDBC瘦客户端连接字符串,以便我的Java程序首先尝试连接到第一个数据库,如果出现问题,它将尝试连接到第二个数据库。 / p>
然而,这在实践中并没有发生。
如果我使用以下字符串:
jdbc:oracle:thin:@(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = site1)
(PORT = 1521)
)
(ADDRESS =
(PROTOCOL = TCP)
(HOST = site2)
(PORT = 1521)
)
)
(FAILOVER=ON)
(FAILOVER_MODE=
(TYPE=SELECT)
(METHOD=BASIC)
(RETRIES=20)
(DELAY=3)
)
(LOAD_BALANCE = OFF)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYDB)
)
)
现在我知道site1
已关闭且site2
已启用。如果我在列表中指定site2
,那么我会得到一个连接(就像我只是想要连接到site2
一样)。但是,当我首先放置site1
时,我得到了同样的错误,就好像我尝试直接连接到site1
- 这是:
java.util.concurrent.ExecutionException:
java.lang.RuntimeException:
java.sql.SQLException:
ORA-01033: ORACLE initialization or shutdown in progress
Oracle瘦客户端是否要求第一个数据库处理连接,并且只有在连接期间出现问题时才进行故障转移?我想要的是应用程序尝试下一个服务器,如果第一个服务器的连接失败(我可以使用try { ... } catch { ... }
应用程序逻辑,但我更喜欢驱动程序为我处理细节)。
答案 0 :(得分:2)
您使用与SID相同的service_name。 即使您停止服务MYDB,它也会因为SID而找到它。 primary db处于挂载模式,这样就解释了你得到的错误。
创建一个新的service_name(除了您的SID)并连接该servicename
例如:service_name = MYDB_CLIENT
答案 1 :(得分:0)
尝试一下,在经过数小时的故障排除后,我发现了一个我修改过的样本,它的工作原理类似于宝石。
jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(port=1521)(host=19.16.200.11)) (address=(protocol=tcp)(port=1521)(host=19.16.200.10)))(load_balance = yes)(connect_data=(SERVICE_NAME=stackdb)))
答案 2 :(得分:0)
签出Connection Management Strategies以获取推荐的连接URL。请参阅下面的示例。