Oracle集群(RAC)及 jdbc 连接双机数据库

来源:互联网 发布:网络教育英语统考试题 编辑:程序博客网 时间:2024/05/16 06:25
Oracle集群(RAC)及 jdbc 连接双机数据库 - secyaher - 隐龙 为了一生的信念

还是因为工作经验太浅,虽然工作中每天都要用到ORACLE,不过集群还是第一次接触(包括11G也是第一次用),10G和11G在使用方面没有什么太大区别,主要还是记录下这次集群的测试和使用JDBC链接ORACLE RAC的连接串配置。

集群是把Oracle 实例(运行在服务器上的真来访问数据的进程和内存结构)与Oracle数据库(在存储设备上的实际数据的物理结构,也就是通常所说的数据文件)进行分离。一个真真数据库是一个可为多个实例访问的单一数据库。在真真中,每个实例在各自的服务器上运行。当需要添加额外的资源时,可以在不停机的情况下很容易地增加节点和实例。一旦新的实例启动,真真程序通过服务可以马上利真到,而无需修改真真或真真服务器。恩~以上为照抄 = =

这次的客户是双机访问操作数据库,一台实例名是orcl1,一台是orcl2。访问数据库服务名是orcl,之前我也搜了些资料,最后的想法是写了一个测试程序来测试JDBC链接ORACLE RAC的连接串。代码如下:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Propertiespublic class RacTest {  /**  * 测试RAC  *   */ public static void main(String[] args) throws ClassNotFoundException {   String url;  Connection conn = null;  Statement stmt = null;  ResultSet rs = nullProperties conProps = new Properties();   conProps.put("user", "sys");  conProps.put("password", "sys");  conProps.put("internal_logon", "sysdba")// String username = "sys";  // String password = "oracle";   url = "jdbc:oracle:thin:@(description= (ADDRESS_LIST =";  url += "(address=(protocol=tcp)(host=10.37.27.111)(port=1521))";  url += "(address=(protocol=tcp)(host=10.37.27.112)(port=1521))";  url += "(load_balance=yes))";  url += "(connect_data =";  url += "(server = dedicated)";  url += "(service_name=orcl)";  url += "(failover_mode =";  url += "(type=session)";  url += "(method=basic)";  url += "(retries=5)";  url += "(delay=15))";  url += " ))"String sql = "select * from v$instance"try {   Class.forName("oracle.jdbc.driver.OracleDriver");   conn = DriverManager.getConnection(url, conProps);   // conn = DriverManager.getConnection(url, username, password);   stmt = conn.createStatement();   rs = stmt.executeQuery(sql);   if (rs.next()) {    System.out.print(rs.getString("INSTANCE_NAME"));   }   rs.close();   rs = null;   stmt.close();   stmt = null;   conn.close();   conn = null;  } catch (SQLException ex) {   ex.printStackTrace();  } finally {    if (rs != null) {    try {     rs.close();      rs = null;    } catch (Exception ex) {     ex.printStackTrace();    }   }   if (stmt != null) {    try {     stmt.close();     stmt = null;    } catch (Exception ex) {     ex.printStackTrace();    }   }   if (conn != null) {    try {     conn.close();     conn = null;    } catch (SQLException ex) {     ex.printStackTrace();    }   }   }  } }

每次执行都会打印出链接到此台服务器ORACLE的SID,如果要负载均衡的话,他应该随机会打印出orcl1和orcl2。由于只有SYSDBA用户才有权限查询出SID所以测试的用户得是DBA身份,不知道我这样的测试方法是否正确,总之是测试通过了(ORCL1和ORCL2随机打印)。

顺便记录下配置链接字符串的参数:

address后面就是连接的IP和端口号没什么说的。load_balance=yes;表示是否负载均衡。server = dedicated;表示专用服务器模式,感觉可以去掉。service_name=orcl;要操作数据库的服务名。TYPE = SESSION表示当一个连接好的会话的实例发生故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的SQL 需要重新执行。METHOD = BASIC表示初始连接就连接一个接点,他还有个选项是preconnect,表示初始连接所有的接点。RETRIES:重试次数。DELAY:重试的延迟(以秒为单位)。

并且集群中如果ORACLE服务器的LISTENER配置的是本机的机器名,则应用方面最好把winnt下的system32/drivers/etc/hosts文件更改一下。最后加上IP对应的机器名,比如:

10.37.27.111 linux1-vip

10.37.27.112 linux2-vip

如果有什么不对的以后继续更改 = =。

原创粉丝点击