【问题标题】:JDBC Oracle Thin Client to Fail Over to Second DBJDBC Oracle 瘦客户端故障转移到第二个数据库
【发布时间】:2019-10-18 05:53:50
【问题描述】:

我了解到我可以设置一个 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 first,那么我会得到一个连接(就像我尝试连接到site2 时所期望的那样)。但是,当我首先输入 site1 时,我会遇到与尝试直接连接到 site1 相同的错误 - 这是:

java.util.concurrent.ExecutionException:
  java.lang.RuntimeException:
    java.sql.SQLException:
      ORA-01033: ORACLE initialization or shutdown in progress

Oracle 瘦客户端是否要求第一个数据库进行连接,并且仅在连接期间出现问题时才进行故障转移?如果与第一台服务器的连接失败,我想要应用程序尝试下一台服务器(我可以使用try { ... } catch { ... } 应用程序逻辑来完成,但希望驱动程序为我处理详细信息)。

【问题讨论】:

    标签: oracle jdbc


    【解决方案1】:

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

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

    例如:service_name = MYDB_CLIENT

    【讨论】:

      【解决方案2】:

      试试这个,经过几个小时的故障排除后,我发现了一个我修改过的示例,它就像宝石一样工作。

      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)))
      

      【讨论】:

        【解决方案3】:

        查看Connection Management Strategies 以获取推荐的连接 URL。请参阅下面的示例。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多