【发布时间】:2018-09-11 13:24:18
【问题描述】:
我正在尝试使用 Oracle 12c 数据库和 Oracle UCP(通用连接池)实现应用程序连续性。根据官方文档,我在我的应用程序中实现了以下内容。我在我的应用程序中使用 ojdbc8.jar 以及等效的 ons.jar 和 ucp.jar。
PoolDataSource pds = oracle.ucp.jdbc.PoolDataSourceFactory.getPoolDataSource();
根据 oracle 文档的属性:
pds.setConnectionFactoryClassName("oracle.jdbc.replay.OracleDataSourceImpl");
pds.setUser("username");
pds.setPassword("password");
pds.setInitialPoolSize(10);
pds.setMinPoolSize(10);
pds.setMaxPoolSize(20);
pds.setFastConnectionFailoverEnabled(true);
pds.setONSConfiguration("nodes=IP_1:ONS_PORT_NUMBER,IP_2:ONS_PORT_NUMBER");
pds.setValidateConnectionOnBorrow(true);
pds.setURL("jdbc:oracle:thin:@my_scan_name.my_domain_name.com:PORT_NUMBER/my_service_name");
// I have also tried using the TNS-Like URL as well. //
但是,我无法实现应用程序的连续性。当我关闭运行我的数据库服务的 RAC 节点时,我希望重播一些正在进行的事务。我观察到我的服务迁移到集群中的下一个可用 RAC 节点,但是,我的进行中事务失败。这里期望发生的是驱动程序将自动重新启动失败的正在进行的事务。但是,我没有看到这种情况发生。我触发的查询是数据库,有时我看到它们在数据库端再次被触发,但我们在客户端看到连接关闭异常
根据一些文档,应用程序连续性允许应用程序屏蔽用户的中断。我的疑问是,我对应用程序连续性将重放发生中断时正在进行的 SQL 语句的理解是否正确,或者应用程序连续性的真正含义是什么。
我参考了一些博客,例如this, https://martincarstenbach.wordpress.com/2013/12/13/playing-with-application-continuity-in-rac-12c/
此处提到的示例似乎并非用于重放运行中的 SQL 语句。
应用程序连续性是否能够在中断期间重放运行中的 SQL 语句,或者 FCF 和应用程序连续性是否仅恢复连接对象的状态并使其在中断发生后可供用户使用。如果前面是正确的,那么请指导我,如果我的代码中的应用程序级别设置中缺少任何使我无法实现重播的内容。
【问题讨论】:
-
视情况而定。我确实测试过,似乎 JDBC 驱动程序对记住的更改量有一些内部限制。如果超过此阈值,当连接被终止时,您将收到 java.sql.sqlRecoverableException。我无法找到并记录此阈值的值。
标签: java oracle transactions oracle12c ojdbc