Oracle UCP - FCF计划中断支持

时间:2012-02-17 13:21:35

标签: java connection-pooling ucp

我正在测试Oracle通用连接池(UCP)版本11.2.0.1.0的快速连接故障转移(FCF)支持。正在尝试的方案是计划中断事件。 Oracle Database 11g 11.2.0.2.0版标准版是正在使用的数据库版本。以下是我在测试中遵循的步骤

  1. 获取连接并打印已连接的实例
  2. 在其中一个节点上执行“srvctl stop instance -d -n”
  3. 对第一步中检索到的连接执行查询。
  4. 第3步失败并出现错误(ORA-03113:通信信道上的文件结束),因为它是计划中断事件。分析ucp日志我可以看到jdbc客户端收到FAN事件,并通过将连接状态标记为“STATUS_CLOSE_ON_RETURN”进行处理,但仍使用该借用连接执行查询失败。

    预期的结果是,在借用的连接上执行的任何查询都会成功,并且连接仍然有效,直到它返回到池中。之后它应该被池关闭。在完成此操作之前,stop instance命令不应该成功。

    配置中是否有任何遗漏?上面的srvctl命令是否正确?

    Oracle池配置如下

    
    
    PoolDataSourceImpl pds = new PoolDataSourceImpl();
            try {
                pds.setConnectionPoolName("Connection Pool");
                pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
                pds.setConnectionFactoryProperties(getOracleDataSourceProperties());
                pds.setDataSourceName("DataSource");
                pds.setServerName(SERVER_NAME);
                pds.setUser("system");
                pds.setPassword("pass");
                pds.setPortNumber(1521);
                pds.setMinPoolSize(0);
                pds.setMaxPoolSize(25);
                pds.setMaxIdleTime(1800);
                pds.setValidateConnectionOnBorrow(true);
                pds.setONSConfiguration("nodes=v-ind-db-11g-01:6200,v-ind-db-11g-02:6200");
                pds.setFastConnectionFailoverEnabled(true);
                pds.setInactiveConnectionTimeout(20);
                pds.setConnectionWaitTimeout(20);
                pds.setPropertyCycle(60);
    
                pds.startPool();
            } catch (SQLException e) {
                throw new RuntimeException("Cannot create project datasource", e);
            }
    
            .......
            Properties getOracleDataSourceProperties() {
                Properties p = new Properties();
                p.put("driverType", "oci");
                p.put("networkProtocol", "tcp");
                p.put("serviceName", SERVICE_NAME);
                return p;
            }
    
    

2 个答案:

答案 0 :(得分:1)

如果您执行SHUTDOWN NORMAL然后完成交易,您的应用会继续优雅吗?

Looks like srvctl stop instance -d XXX -n YYY -o normal应该这样做。

This thread建议srvctl的默认关闭方法是“立即”,这可以解释你所看到的内容。

答案 1 :(得分:1)

我能够通过两次更改测试UCP对FCF的支持

  1. 创建新服务。初始尝试中使用的服务是默认服务,FCF功能不适用于注释中所述的here默认服务。

  2. 停止服务而不是实例。停止实例会模拟意外中断,而不是计划中断。