`
rommal7090
  • 浏览: 107440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle RAC DB Failover, JNDI remote lookup

 
阅读更多
前一段时间production的某一个RAC DB node挂掉了,但是不管是OC4J还是其他application 的JDBC Connection都没有failover到live的DB node上面去,于是各种google, 先写了个test 程序看看conncetion挂了能不能自动释放,这个就涉及到JNDI的RMI lookup, 程序如下:

package com.m.toplink.connection;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.naming.Context;
import javax.naming.InitialContext;

import junit.framework.TestCase;
import oracle.jdbc.pool.OracleConnectionCacheManager;
import oracle.oc4j.sql.ManagedDataSource;

import org.junit.Test;

public class ConnectionPoolFailOverTest extends TestCase {

  @Test
  public void testGetConnection() throws Exception {

    Hashtable<String,String> env1 = new Hashtable<String,String>();
    env1.put("java.naming.factory.initial", "com.evermind.server.rmi.RMIInitialContextFactory");
    env1.put("java.naming.provider.url", "opmn:ormi://localhost:6007/");
//注意默认是ormi://localhost:23791/
    env1.put("java.naming.security.principal", "oc4jadmin");
    env1.put("java.naming.security.credentials", "oc4jadmin");
    Context context1 = new InitialContext(env1);
    ManagedDataSource datasource = (ManagedDataSource) context1.lookup("jdbc/OracleAdminDS");
    List<Connection> connections=new ArrayList<Connection>();
    for (int i = 0; i < 30; i++) {
      try{
      Connection conn = datasource.getConnection();
      connections.add(conn);
      conn.setAutoCommit(false);
      Statement stat= conn.createStatement();
      ResultSet rs= stat.executeQuery("select instance_name from v$instance");
      while(rs.next()){
        System.out.println(i+"="+rs.getString(1));
      }
      Thread.sleep(10000);
      ResultSet rs1= stat.executeQuery("select instance_name from v$instance");
      rs1= stat.executeQuery("select instance_name from v$instance");
      while(rs1.next()){
        System.out.println(i+"in="+rs1.getString(1));
      }
      System.out.println(conn);
      System.out.println(conn.isClosed());
      
      Map status1= OracleConnectionCacheManager.getConnectionCacheManagerInstance().getStatistics("CS2AdminDSPool_default");

      for(Object oneKey: status1.keySet()){
        System.out.println(oneKey+"="+status1.get(oneKey));
      }

      if(i==3){
        System.out.println(conn.isClosed());
        String [] cacheNames= OracleConnectionCacheManager.getConnectionCacheManagerInstance().getCacheNameList();
        int activeConn= OracleConnectionCacheManager.getConnectionCacheManagerInstance().getNumberOfActiveConnections("CS2AdminDSPool_default");
        System.out.println("activeConn="+activeConn);
        int avaliableConn= OracleConnectionCacheManager.getConnectionCacheManagerInstance().getNumberOfAvailableConnections("CS2AdminDSPool_default");
        System.out.println("avaliableConn="+avaliableConn);
        Map status= OracleConnectionCacheManager.getConnectionCacheManagerInstance().getStatistics("CS2AdminDSPool_default");

        for(String cacheName: cacheNames){
          System.out.println(cacheName);
        }
        
        for(Object oneKey: status.keySet()){
          System.out.println(oneKey+"="+status.get(oneKey));
        }
        
        System.out.println(conn);
        try{
        Statement invalidStat= connections.get(0).createStatement();
        ResultSet invalidRs= invalidStat.executeQuery("select instance_name from v$instance");
        while(invalidRs.next()){
          System.out.println(i+"invalid="+invalidRs.getString(1));
        }
       // OracleConnectionCacheManager.getConnectionCacheManagerInstance().
        }catch(SQLException e){
          System.out.println();
         // OracleConnectionCacheManager.getConnectionCacheManagerInstance().getNumberOfActiveConnections();
          //OracleConnectionCacheManager.getConnectionCacheManagerInstance().getCacheNameList();
          if (OracleConnectionCacheManager.getConnectionCacheManagerInstance().isFatalConnectionError(e)) {
            System.out.println("FCF execption1");
          }
          System.out.println("FCF execption");
          e.printStackTrace();
        }
      }
      
     // conn.commit();
      //conn.close();
      }catch(Exception e){
        System.out.println("In refresh");
     //   OracleConnectionCacheManager.getConnectionCacheManagerInstance().refreshCache("CS2AdminDSPool_default",  OracleConnectionCacheManager.REFRESH_INVALID_CONNECTIONS);
     //   OracleConnectionCacheManager.getConnectionCacheManagerInstance().purgeCache("CS2AdminDSPool_default",  true);

        System.out.println("Refreshed");
        Thread.sleep(5000);
        e.printStackTrace();
      }
    }
    Thread.sleep(20000);
 
  }
}

在test 环境下面的RAC DB有2个node,RAC 环境的ONE ONS(即某个RAC DB node挂了以后会自动广播一个event,让其他node都知道)之类的都设置好了,发现上面的代码确实没有释放挂掉的connection,之后找了好多资料,发现OC4J JNDI datasource的某个property (property-check-interval="60"
默认是15分钟check一次)没有设置,在data-sources.xml里面加了这个property以后,发现上面的代码FCF其实是OK的,apply上production,不过不能随便弄production,没办法verify.


0
0
分享到:
评论

相关推荐

    Oracle RAC Failover 详解

    ### Oracle RAC Failover 详解 #### 一、概述 Oracle Real Application Clusters (RAC) 是一种集群数据库解决方案,旨在提供高可用性和负载均衡功能。其中,高可用性的一个核心组成部分是 Failover(故障转移)...

    数据库oracle rac 修改db_unique_name参数

    Oracle RAC 修改 db_unique_name 参数 在 Oracle RAC 环境中,db_unique_name 参数是一个非常重要的参数,它决定了数据库的唯一标识。在某些情况下,我们需要修改 db_unique_name 参数,以便满足特定的需求。本文将...

    Oracle rac功能测试方案

    ### Oracle RAC 功能测试方案详解 #### 一、引言 Oracle Real Application Clusters (RAC) 是一种高可用性、高性能的企业级数据库解决方案。本文档旨在提供一个全面的Oracle 11g RAC安装后的功能测试方案,主要包括...

    Oracle RAC 项目实施方案

    Oracle RAC 项目实施方案 Oracle RAC(Real Application Clusters)是 Oracle 公司的一种集群解决方案,旨在提供高可用性和高性能的数据库解决方案。在生产环境下实施 Oracle RAC 需要进行详细的规划和实施本文将...

    DB2 HADR VS ORACLE RAC

    另一方面,Oracle RAC的 Transparent Application Failover (TAF)可能会在故障切换时出现问题,如配置复杂且可能出现25%的查询回退概率,而DB2 HADR的配置更简单,且能自动重路由连接至备用服务器。 从价格成本角度...

    Oracle RAC增加ASM盘,创建表空间

    Oracle RAC 增加 ASM 盘, 创建表空间 Oracle RAC 是一种高可用、高性能的数据库解决方案,通过将多个服务器节点组成一个集群,提供了高可用性和高性能的数据库服务。在 Oracle RAC 中,ASM(Automated Storage ...

    oracle rac防火墙配置学习

    Linux 常用命令 oracle rac 中文手册 官网翻译 oracle rac

    深入理解Oracle RAC 12c(完整书签).pdf

    Oracle RAC 12c是Oracle数据库的集群版本,全称是Oracle Real Application Clusters。它允许在多个计算机之间分布数据和负载,提供了高可用性、可扩展性和灵活性。RAC技术是Oracle数据库12c版本中提供的一项关键特性...

    Windows平台Oracle RAC 集群安装过程

    ### Windows平台Oracle RAC集群安装过程详解 #### 引言 在企业级应用环境中,为了提高数据处理能力和系统的高可用性,Oracle Real Application Clusters (RAC) 成为了一种热门选择。尤其在Windows平台上部署Oracle...

    Oracle RAC重启操作手册

    ### Oracle RAC重启操作手册知识点解析 #### 一、准备工作 **知识点1:确认应用程序状态** - **背景**: 在进行任何重启操作之前,确保所有的应用程序都已经停止是非常重要的一步。 - **目的**: 避免在数据库重启...

    Oracle RAC 12c运维最佳实践指南.pdf

    Oracle RAC 12c 运维最佳实践指南 Oracle RAC 12c 是一种高可用、高性能的集群解决方案,旨在实现数据库的高可用性和可扩展性。本文将对 Oracle RAC 12c 运维最佳实践指南进行解读,总结出相关的知识点。 一、 ...

    记录一次在Vmware ESXi6虚拟机环境下搭建oracle的RAC的过程

    Vmware ESXi6虚拟机环境下搭建Oracle RAC的过程 在本文中,我们将记录一次在Vmware ESXi6虚拟机环境下搭建Oracle RAC的过程。Oracle RAC(Real Application Clusters)是一种高可用性解决方案,能够提供高性能和高...

    华为云ECS ORACLE RAC 11.2.0.4 的安装指导

    【华为云ECS ORACLE RAC 11.2.0.4 安装指导】 在当前技术环境中,由于去IOE(IBM、Oracle、EMC)的趋势,许多国内企业正考虑替换Oracle数据库,转而使用国产数据库或云计算平台上的数据库服务。然而,将Oracle RAC...

    Understanding Oracle RAC Internals - The Cache Fusion Edition

    标题《Understanding Oracle RAC Internals - The Cache Fusion Edition》涉及的主题是Oracle RAC内部机制,特别是Cache Fusion技术。Oracle RAC(Real Application Clusters)是Oracle数据库的一个重要特性,它允许...

    Oracle RAC核心技术详解

    Oracle RAC(Real Application Clusters)是Oracle数据库的一项高级特性,它允许多个实例同时访问同一个物理数据库,从而实现高可用性和负载均衡。在Oracle RAC核心技术详解中,我们将深入探讨RAC的工作原理、架构、...

    oracle rac 安装部署文档.pdf

    Oracle RAC 安装部署文档 本文档详细介绍了 Oracle RAC 的安装部署过程,涵盖了物理硬件配置需求、虚拟机需求、操作系统安装、数据库安装、 Oracle RAC 图形界面搭建方法、创建磁盘组、安装 Oracle 数据库、性能...

    oracle RAC集群修改归档日志路径.docx

    Oracle RAC(Real Application Clusters)集群是一种高可用性解决方案,它允许多个实例同时访问同一个数据库,确保在单个节点故障时数据的连续性和一致性。归档日志是Oracle数据库的重要组成部分,它们记录了自上次...

    oracle rac 不停机调整时间.txt

    oracle rac 不停机调整时间.txt

    weblogic连接oracle RAC数据源配置

    - URL格式通常是:`jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=rac_node1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac_node2)(PORT=1521)))...

    Hypver-v Linux虚机配置Oracle RAC

    Hypver-v Linux虚机配置Oracle RAC

Global site tag (gtag.js) - Google Analytics