急:DELPHI用ADO方式连接ORACLE RAC不能实现自动切换(200分)

  • 主题发起人 bevislee
  • 开始时间
B

bevislee

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:DEPHI 7 ORACLE10G RAC <br><br>ORACLE TNSNAMES配置<br><br><br>总连接<br>ORAHB =<br>&nbsp; (DESCRIPTION =<br>&nbsp; &nbsp; (ADDRESS_LIST =<br>&nbsp; &nbsp; &nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 10.180.1.2)(PORT = 1521))<br>&nbsp; &nbsp; &nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 10.180.1.3)(PORT = 1521))<br>&nbsp; &nbsp; &nbsp; (LOAD_BALANCE = yes)<br>&nbsp; &nbsp; )<br>&nbsp; &nbsp; (CONNECT_DATA =<br>&nbsp; &nbsp; &nbsp; (SERVICE_NAME = orahb)<br>&nbsp; &nbsp; &nbsp; (FAILOVER_MODE =<br>&nbsp; &nbsp; &nbsp; &nbsp; (TYPE = SELECT)<br>&nbsp; &nbsp; &nbsp; &nbsp; (METHOD = BASIC)<br>&nbsp; &nbsp; &nbsp; &nbsp; (RETRIES = 80)<br>&nbsp; &nbsp; &nbsp; &nbsp; (DELAY = 5)<br>&nbsp; &nbsp; &nbsp; )<br>&nbsp; &nbsp; )<br>&nbsp; )<br><br><br>服务器1连接<br>ORAHB1 =<br>&nbsp; (DESCRIPTION =<br>&nbsp; &nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 10.180.1.2)(PORT = 1521))<br>&nbsp; &nbsp; (CONNECT_DATA =<br>&nbsp; &nbsp; &nbsp; (SERVER = DEDICATED)<br>&nbsp; &nbsp; &nbsp; (SERVICE_NAME = orahb)<br>&nbsp; &nbsp; &nbsp; (INSTANCE_NAME = orahb1)<br>&nbsp; &nbsp; )<br>&nbsp; )<br><br><br>服务器2连接<br>ORAHB2 =<br>&nbsp; (DESCRIPTION =<br>&nbsp; &nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 10.180.1.3)(PORT = 1521))<br>&nbsp; &nbsp; (CONNECT_DATA =<br>&nbsp; &nbsp; &nbsp; (SERVER = DEDICATED)<br>&nbsp; &nbsp; &nbsp; (SERVICE_NAME = orahb)<br>&nbsp; &nbsp; &nbsp; (INSTANCE_NAME = orahb2)<br>&nbsp; &nbsp; )<br>&nbsp; )<br><br>用ADO控件连接总的连接串ORAHB,并确保ADOConnection1连接到服务器1上,连接正常,当手工shutdown服务器1上的数据库时,<br><br>ADOConnection1.Connect:=false;<br><br>ADOConnection1.Connect:=True; 都正常,但连接ADOConnection1的Query报告数据库连接失败,事实上,ADOConnection1.Connect:=false;ADOConnection1.Connect:=true操作并没有使连接自动切换到服务器2上,但将ADOConnection1重建或将程序关闭再打开时连接正常。请问,如何配置能使数据库1连接失败时自动切换到数据库2上?
 
不知道你为什么要切换<br>在我看来你可以先把2个connection都打开 <br>程序部分判断那个代开就用哪个(如果你需要关闭某一个)
 
问题我已经解决了,ADO控件是不支持RAC自动切换的。在数据库单节点故障时,还是会中断连接。我是设置了一个全局变量v_error,在每个QUERY都加的except,如果执行失败就将v_error置为1,通过TIMER或下次访问数据库连接时首先判断该变量,如果变量是1就将ADOCONNECTION重建<br><br>ADOConnection1.Close; <br>FreeAndNil(ADOConnection1);<br>ADOConnection1 := TADOConnection.Create(nil);<br>ADOConnection1.LoginPrompt:=false;<br>再将所有的query或table的连接重新指向ADOConnection1,因为ADOConnection1重建后query或table的连接也默认清除了。<br><br>目前这样做效果很好,没出现其他的问题。不过也非常感谢onyliu的答复
 
不建议使用ADO<br>看看好象有个 ORA的组件包
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部