java - 通用连接池 java JDBC Oracle 12c 的应用程序连续性

标签 java oracle transactions oracle12c ojdbc

我正在尝试使用 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 语句的理解是否正确,或者是应用程序连续性的真正含义。

我引用了一些这样的博客, https://martincarstenbach.wordpress.com/2013/12/13/playing-with-application-continuity-in-rac-12c/

这里提到的示例似乎并不是为了重放运行中的 SQL 语句。

应用程序连续性是否能够在中断期间重播正在进行的 SQL 语句,或者 FCF 和应用程序连续性是否仅恢复连接对象的状态并使其可供用户在发生中断后使用。如果前面的情况是正确的,那么如果我在代码中的应用程序级别设置中遗漏了任何阻止我实现重播的内容,请指导我。

最佳答案

是的,您的理解是正确的。通过重播驱动程序,应用程序连续性可以重播正在进行的工作,以便应用程序看不到中断,并且应用程序可以继续运行,因此该功能的名称。从应用程序中唯一可见的是导致中断的 JDBC 调用出现轻微延迟。还可以看到 JDBC 端内存使用量的增加,因为驱动程序维护了一个调用队列。幕后发生的事情是,一旦中断,您的物理 JDBC 连接将被一个全新的连接所取代,并且重播驱动程序将重播其调用队列。

现在可能会出现重播失败的情况。例如,如果数据发生更改,重播将失败。如果“请求”中有多个事务,重播也将被禁用。当从池中借用连接时,“请求”开始,当连接返回到池中时,“请求”结束。通常,“请求”与 servlet 执行相匹配。如果在此请求中您有多个“提交”,则重播将在运行时被禁用,并且重播驱动程序将停止排队。另请注意,必须禁用自动提交。

[我是设计和实现此功能的 Oracle 团队的一员]

关于java - 通用连接池 java JDBC Oracle 12c 的应用程序连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276991/

相关文章:

java - 根据最接近的小数值舍入 - java

sql - 最大非空列

django - 如何测试具有 transaction.atomic(using=myDb) 的 Django View ?

transactions - 自治事务范围和错误引发

java - 寻找 StringBuilder 的高性能替代品

java - Spring 数据 JPA : how to enable cascading delete without a reference to the child in the parent?

java - 保存 HashMap 共享首选项

oracle - ORA-01537。我想搜索包含该文件的位置

带有 CONTAINS 查询的 Java 准备语句

mysql - Hibernate未插入到mysql : showing insert statements