小生我最近第一次接触到双机,客户买了一台HP安腾小型机外带一存储,环境如下:
操作系统:HP-UNIX 11.31(带serviceguard)
数据库:oracle10.2.0.1.0
安装描述:该小型机一共4个分区,我拿了其中两个分区做oracle rac,费了九牛二虎之力和HP工程师一起把双机环境搭好了,裸设备也都按预定的划分出来,安装中途坎坎坷坷,不过后来总算将clusterware及数据库都安装成功了。
双机IP配置如下:
192.168.1.110 node01(节点一)
192.168.1.111 node02(节点二)
192.168.1.112 node01_vip(节点一虚拟IP)
192.168.1.113 node02_vip(节点二虚拟IP)
配置远程数据库:
GADB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.113)(PORT = 1521))
      (LOAD_BALANCE=yes)
      (FAILOVER=on)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = GADB)
    )
  )
我用sqlplus,pl/sql developer,toad连接数据库一切OK,我还特意用sqlplus断开连接测试很多次一切OK,但当我手工写了一个DBACCESS测试时,问题出现了,程序如下:
package cn.com;import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBAccess {
        private String driver="oracle.jdbc.driver.OracleDriver";
private String url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.112)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.113)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=on))(CONNECT_DATA=(SERVICE_NAME=GADB)))";
private String user="GATI";
private String pwd="GATI";
private Connection conn;
private Statement stmt;
private ResultSet rst;
public DBAccess() {
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,pwd);
stmt=conn.createStatement();
System.out.println("连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
System.out.println("创建异常");
e.printStackTrace();
System.out.println(e.getCause());
System.out.println(e.getErrorCode());
}
}

public ResultSet query(String sql){
try {
rst=stmt.executeQuery(sql);
} catch (SQLException e) {

e.printStackTrace();
}
return rst;
}

public int update(String sql){
int flag=-1;
try {
flag=stmt.executeUpdate(sql);
} catch (SQLException e) {

e.printStackTrace();
}
return flag;
}

public void close(){
try {
if(rst!=null){
rst.close();
rst=null;
}

if(stmt!=null){
stmt.close();
stmt=null;
}

if(conn!=null){
conn.close();
conn=null;
}
System.out.println("关闭");
} catch (SQLException e) {
System.out.println("关闭异常");
e.printStackTrace();
}
}

public Connection getConn() {
return conn;
} public static void main(String[] args) {
DBAccess db = new DBAccess();
db.close();
}
}
测试结果,有时连接成功,有时报错,错误信息如下:
创建异常
java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(ERR=1153)(VSNNUM=169869568)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(ADDRESS=(PROTOCOL=TCP)(HOST=node02)(PORT=1521))'))(ERROR=(CODE=305)(EMFI=1))))
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:404)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at cn.com.DBAccess.<init>(DBAccess.java:35)
at cn.com.DBAccess.main(DBAccess.java:103)

补充一点:上面的错误有时是node01有时是node02,请各位大侠指点,先谢谢了!!

解决方案 »

  1.   

    忘记说了,JDBC驱动classes12和ojdbc14我都试过一样的问题!!
      

  2.   

    没人配过oracle双机吗,我自己顶!!!!
      

  3.   

    我也遇到这个问题。 后来换了Oracle 9i 9.2.0.4的JDBC驱动。 就没再出问题了。 你可以试试。
    9204 jdbc驱动下载:
    http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html下载9204的 ojdbc14.jar ,,,再试下看。
      

  4.   

    你这个url是不是有问题啊
    格式应该是jdbc:oracle:thin:@192.168.0.39:1521:TARENADB
      

  5.   

    双机的时候有时会出现一台能连,一台不能连的情况,只要将ip设成一样的就可以了,java里是有这样的情况