jdbc使用service_name连接oracle双机环境(RAC)

2009-06-01 | By Jinyang | Filed in: 技术相关.

很基础的东西,之前工作中没太用过RAC的环境,特地备忘下。
Oracle RAC环境对外公布的肯定都是Service Name的,不像单机环境一样直接用SID来做连接,具体示例如下:

主要参考: 

 

1.  JDBC连接Oracle RAC的连接串配置

链接:

 

 

2.  连oracle 数据库是报Got minus one from a read call错误

最终代码:

 

package cn.****.****.common;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

 

public class DbConn {

 

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

String url="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 地址1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 地址2)(PORT = 1521))(LOAD_BALANCE = yes)(FAILOVER = ON)(CONNECT_DATA =(SERVICE_NAME = qhwtdb)(FAILOVER_MODE=(TYPE = SELECT)(METHOD = BASIC)(RETIRES = 20)(DELAY = 15))))";
 

                     //注意,上面去除了eygle的示例的(SERVER = DEDICATED) ,否则会报 Io 异常: Got minus one from a read call 的错误,这个取决于Oracle的设置:oracle独占模式(Dedicated Server Mode)和共享模式(Shared Server Mode) ,不同的模式对应的连接方式自然不同

Connection c = DriverManager.getConnection(url,"username","password");

Statement s = c.createStatement();

ResultSet r = s.executeQuery("select sysdate from dual");

while(r.next()) {

System.out.println(r.getString(1));

}

}catch(Exception e) {

System.out.println(e.toString());

}

 

}

 

}

 

 关于参数的部分Google了些资料:

1. http://hi.baidu.com/_linzi_/blog/item/65666124899d5a044c088d05.html 

 

 

 

FAILOVER_MODE的子参数含义:

TYPE1)session—如果用户连接丢失,将创建一个新的会话连接到备用节点,用户的所有未提交的操作必须回滚,然后再次执行,SELECT操作也被中止.

2)select—如果用户连接丢失,将使用游标和之前的快照继续执行SELECT操作,叫做SQL接管,SQL接管能够无缝接管理的事务类型只有SELECT语句.其它的操作也必须要回滚然后再次执行.

3)none—客户端默认值,禁止SQL接管功能,主要用于测试的目地,在实际应用中TYPE应指定为session 或者select

 

METHOD1)basic—仅仅在FAILOVER发生时才连接备用节点

2)preconnect—在用户连接到主节点时同时也在备用节点产生一个连接会话,设置预连接模式,能够快速接管SQL

 

RETRIES:当前节点失败后,失败切换功能会尝试连接备用节点,这个值确定了尝试的次数,如果仅DELAY被指定,RETRIES默认为5

 

DELAY:两次尝试之间等待的秒数,如果仅指定RETRIESDELAY默认为1

 

BACKUP:指定另外一个用于备份连接的网络服务名,当RAC设置为主次模式时,使用此参数,并且METHOD应该设为preconnect

 

如果要使用预连接,就不能使用客户端负载均衡和服务器端负载均衡,否则没有意义!!!


Tags:

发表评论

电子邮件地址不会被公开。 必填项已用*标注