私は、Oracle Universal Connection Pool (UCP) バージョン 11.2.0.1.0 の Fast Connection Failover (FCF) サポートをテストしています。試行中のシナリオは、計画停止イベントです。Oracle Database 11g Release 11.2.0.2.0 standard edition が、使用されているデータベース バージョンです。以下は、私のテストで従う手順です
- 接続を取得し、接続先のインスタンスを出力します
- いずれかのノードで「srvctl stop instance -d -n」を実行します
- 最初のステップで取得した接続に対してクエリを実行します。
3 番目のステップは、計画的な停止イベントであるため、エラー (ORA-03113: end-of-file on communication channel) で失敗します。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;
}