java - Oracle UCP - FCF 计划中断支持

标签 java connection-pooling ucp

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

  1. 获取连接并打印其连接的实例
  2. 在其中一个节点上执行“srvctl stop instance -d -n ”
  3. 对第一步中检索到的连接执行查询。

第三步失败并出现错误(ORA-03113:通信 channel 上的文件结束),但实际上它不应该失败,因为这是计划的中断事件。分析 ucp 日志,我可以看到 jdbc 客户端接收到 FAN 事件,并通过将连接状态标记为“STATUS_CLOSE_ON_RETURN”进行处理,但仍然使用借用的连接执行查询失败。

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

我的配置中是否缺少任何内容?上述 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;
        }

最佳答案

如果您执行SHUTDOWN NORMAL然后完成您的交易,您的应用程序是否继续正常运行?

Looks like srvctl stop instance -d XXX -n YYY -o normal 应该执行此操作。

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

关于java - Oracle UCP - FCF 计划中断支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329001/

相关文章:

java - 从 Java 构建的 SQL 查询中存在无效字符 "200b"

java - 为什么 JVM 不预先编译整个程序,而是一段一段地编译呢?

java - 基于 Spring Boot AMQP 的 JmsListener 在 TextMessage 上失败

python - 如何在 psycopg2 连接池中使用 "INSERT"?

java - 连接池不适用于通过 UCP 的 DB2 数据库

java - 如何在 Oracle UCP 中使用 TimeToLiveConnectionTimeoutCallback

Oracle OCI 连接池与 Oracle UCP

java - 如何仅为特定标记设置 InfoWindowAdapter

java - 如何修复c3p0连接池初始化异常?

http - 在实现PoolingHttpClientConnectionManager时遇到问题