0

我读过我可以设置一个 JDBC 瘦客户端连接字符串,以便我的 Java 程序首先尝试连接到第一个数据库,然后如果出现问题,它将尝试连接到第二个数据库。

然而,这在实践中并没有发生。

如果我使用以下字符串:

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 { ... }应用程序逻辑来做,但希望驱动程序为我处理细节)。

4

3 回答 3

2

您使用与您的 SID 相同的 service_name。即使您停止服务 MYDB,由于 SID,它总是会找到它。主数据库处于挂载模式,因此可以解释您遇到的错误。

创建一个新的 service_name(除了您的 SID)并连接到该 servicename

例如:service_name = MYDB_CLIENT

于 2013-11-07T15:14:20.717 回答
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)))
于 2019-10-09T20:10:21.367 回答
0

查看连接管理策略以获取推荐的连接 URL。请参阅下面的示例。

在此处输入图像描述

于 2019-10-17T19:38:48.953 回答