JDBC Oracle瘦客户端故障转移到第二个DB

时间:2013-07-18 08:26:38

标签: oracle jdbc

我已经读过我可以设置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 { ... }应用程序逻辑,但我更喜欢驱动程序为我处理细节)。

3 个答案:

答案 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。请参阅下面的示例。

enter image description here