我正在测试来自 Oracle 通用连接池 (UCP) 版本 11.2.0.1.0 的快速连接故障转移 (FCF) 支持。正在尝试的场景是计划中的中断事件。Oracle Database 11g Release 11.2.0.2.0 标准版是正在使用的数据库版本。以下是我在测试中遵循的步骤
- 获取连接并打印它连接到的实例
- 在其中一个节点上执行“srvctl stop instance -d -n”
- 对第一步中检索到的连接执行查询。
第 3 步失败并出现错误(ORA-03113:通信通道上的文件结束),因为它是计划中的中断事件。分析 ucp 日志,我可以看到 FAN 事件由 jdbc 客户端接收并通过将连接状态标记为“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;
}