Oracle TAC在SQL*Plus正常但Java应用重放失败问题求助
问题分析
报错ORA-17384: Replay is disabled by server Continuity Management说明Java客户端未正确启用TAC所需的连续性配置,导致服务器端拒绝重放请求。SQL*Plus正常证明数据库端TAC服务配置无误,问题集中在UCP和JDBC的客户端配置遗漏。
需补充/修正的配置步骤
启用UCP连接重放功能
UCP需显式开启连接重放支持,在初始化PoolDataSource后添加:pds.setConnectionReplayEnabled(true);同时在连接属性中启用JDBC连续性参数:
pds.setConnectionProperty("oracle.jdbc.enableContinuity", "true");确保Replay数据源的模式设置
你已使用oracle.jdbc.replay.OracleDataSourceImpl,需明确其重放模式为自动触发:((OracleDataSourceImpl)pds.getConnectionFactory()).setReplayMode(OracleDataSourceImpl.REPLAY_MODE_AUTO);检查JDBC驱动版本兼容性
必须使用与Oracle 19c匹配的JDBC驱动(建议19.3.0及以上版本),旧驱动可能不支持TAC完整功能。清理重复代码
代码中重复执行了pds = PoolDataSourceFactory.getPoolDataSource();,保留一次即可,避免冗余对象创建。验证事务边界正确性
TAC仅支持显式事务(auto-commit=false),你已设置此属性,但需确保doTx方法内的操作完全包裹在显式事务中(执行完更新后调用conn.commit()),未提交的事务无法触发重放。
修正后的关键配置片段
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource(); pds.setConnectionFactoryClassName(CONN_FACTORY_CLASS_NAME); pds.setURL(WALLET_URL); pds.setConnectionPoolName("JDBC_UCP_POOL"); pds.setInitialPoolSize(5); pds.setMinPoolSize(5); pds.setMaxPoolSize(20); pds.setTimeoutCheckInterval(5); // 启用FAN与连接重放 pds.setFastConnectionFailoverEnabled(true); pds.setConnectionReplayEnabled(true); // TAC核心连接属性配置 pds.setConnectionProperty(OracleConnection.CONNECTION_PROPERTY_AUTOCOMMIT, "false"); pds.setConnectionProperty("oracle.jdbc.enableContinuity", "true"); pds.setConnectionProperty(OracleConnection.CONNECTION_PROPERTY_IMPLICIT_STATEMENT_CACHE_SIZE, "100"); // 原有其他配置...
额外验证步骤
- 数据库端执行
SELECT service_name, continuity FROM dba_services;,确认pdb_tac服务的continuity状态为ENABLED - 测试时确保中断的是当前连接所在的实例,且备用实例已正常提供服务
- 检查客户端
sqlnet.ora是否配置RETRY_COUNT和RETRY_DELAY参数,保障连接重试机制正常
内容的提问来源于stack exchange,提问作者cptkirkh
相关产品推荐
相关产品推荐

