很基础的东西,之前工作中没太用过RAC的环境,特地备忘下。
Oracle RAC环境对外公布的肯定都是Service Name的,不像单机环境一样直接用SID来做连接,具体示例如下:
主要参考:
1. JDBC连接Oracle RAC的连接串配置
链接:http://www.eygle.com/digest/2008/06/jdbcoracle_rac.html
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的子参数含义:
TYPE:1)session—如果用户连接丢失,将创建一个新的会话连接到备用节点,用户的所有未提交的操作必须回滚,然后再次执行,SELECT操作也被中止.
2)select—如果用户连接丢失,将使用游标和之前的快照继续执行SELECT操作,叫做SQL接管,SQL接管能够无缝接管理的事务类型只有SELECT语句.其它的操作也必须要回滚然后再次执行.
3)none—客户端默认值,禁止SQL接管功能,主要用于测试的目地,在实际应用中TYPE应指定为session 或者select
METHOD:1)basic—仅仅在FAILOVER发生时才连接备用节点
2)preconnect—在用户连接到主节点时同时也在备用节点产生一个连接会话,设置预连接模式,能够快速接管SQL
RETRIES:当前节点失败后,失败切换功能会尝试连接备用节点,这个值确定了尝试的次数,如果仅DELAY被指定,RETRIES默认为5
DELAY:两次尝试之间等待的秒数,如果仅指定RETRIES,DELAY默认为1秒
BACKUP:指定另外一个用于备份连接的网络服务名,当RAC设置为主次模式时,使用此参数,并且METHOD应该设为preconnect
如果要使用预连接,就不能使用客户端负载均衡和服务器端负载均衡,否则没有意义!!!
Tags: jdbc
发表评论