2013-07-18 30 views
0

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

但是这在实践中没有发生。

如果我用下面的字符串:

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 { ... }应用程序逻辑,但希望驱动程序为我处理细节),应用程序可以尝试下一台服务器。

回答

2

您使用与SID相同的service_name。 即使您停止MYDB服务,它也会因为SID而始终找到它。 主数据库处于安装模式,以便解释您获得的错误。

创建一个新的服务名(比你的SID等),并连接在该服务名

例如:SERVICE_NAME = MYDB_CLIENT