24
Oracle 白皮书 2013 6 Oracle Database 12c 中的应用程序连续性

Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

Oracle 白皮书

2013 年 6 月

Oracle Database 12c

中的应用程序连续性

Page 2: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

概要 ....................................................................................................................... 2

引言 ....................................................................................................................... 3

应用程序连续性推出之前的体验 ................................................................................ 4

Oracle Database 12c 中应用程序连续性的体验 ........................................................ 6

Oracle Database 12c 中的应用程序连续性.......................................................... 7

应用程序连续性覆盖的范围 ....................................................................................... 7

应用程序连续性中的处理阶段 .................................................................................... 7

使用应用程序连续性时的限制 .................................................................................... 9

何时不会对请求使用重放 ......................................................................................... 10

可能的副作用 ........................................................................................................... 11

应用程序所有者的评估 ........................................................................................ 11

应用程序所有者的评估步骤 ..................................................................................... 11

评估请求边界 ........................................................................................................... 11

删除 Oracle JDBC 具体类 ........................................................................................ 12

决定是否应该禁用任何请求 ..................................................................................... 12

如果在请求之外设置状态,则注册回调 ................................................................... 13

准许支持保持可变值 ................................................................................................ 13

配置应用程序连续性 ............................................................................................ 14

配置 Oracle JDBC 12c 重放驱动程序 ...................................................................... 14

配置连接以实现高可用性 ......................................................................................... 15

针对应用程序连续性配置服务 .................................................................................. 16

检查资源分配 ........................................................................................................... 17

管理 ..................................................................................................................... 17

计划停机 .................................................................................................................. 17

终止或断开会话,不重放 ......................................................................................... 17

总结 ..................................................................................................................... 18

附录 — 应用程序连续性涉及的新的数据库概念 .................................................. 19

Page 3: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

2

概要

对应用程序开发人员来说,屏蔽(因实例、节点、存储、网络,或任何其他相

关组件引起的)数据库会话中断是非常复杂的,因此,错误和超时常常暴露给

最终用户,从而让用户感到沮丧、失去效率、丧失机会。应用程序连续性通过

在发生中断后为受影响的数据库会话恢复正在进行的工作来屏蔽中断,使其不

会被用户和应用程序所察觉。应用程序连续性在应用程序下层执行这种恢复,

这样,在应用程序看来中断只是一次稍有延迟的执行。

应用程序连续性针对导致可恢复性错误的中断而调用,这些错误通常与底层软

件、前台、硬件、通信、网络或存储层有关。应用程序连续性用于改善在处理

意外中断和计划中断时的用户体验。

应用程序连续性在 Oracle Database 12c 中引入,它增强了使用 Oracle 数据库的

系统和应用程序的容错性。应用程序连续性适用于:

Oracle JDBC 瘦驱动程序

Oracle 通用连接池

Oracle WebLogic Server

“我们知道,Oracle Database 12c 中的应用程序连续性功能将会自动处理许多故障情况,因此,如今

应用程序连续性可以让应用程序相当安全可靠地运行于集群环境中。”

— Marc Fielding,Pythian

Page 4: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

3

引言

应用程序连续性能够在可恢复性错误导致数据库会话不可用时以一种无干扰且

快速的方式重放数据库请求。该请求可能包含对数据库的事务性和非事务性调

用以及在客户端本地或中间层执行的调用。成功重放后,应用程序可从数据库

会话中断的位置继续运行。用户不再因不知道他们的资金转账、航班预订等等

发生了什么情况而疑惑;管理员不再需要重新启动中间层计算机来从会话失败

导致的登录风暴中恢复。通过使用应用程序连续性,可以屏蔽许多计划中断和

意外中断,而且不需要应用程序开发人员来尝试恢复请求,从而改善了最终用

户体验。

不使用应用程序连续性时,应用程序几乎不可能以安全的方式来屏蔽中断,原

因包括:

• 客户端保持在当时状态,具有输入的数据、返回的数据以及缓存的变量,

而数据库会话中反映的状态更改却丢失了。

• 如果发出了提交命令,则提交消息不会持久存在,而且,查核丢失请求的

状态不能担保它在将来不会提交。

• 应用程序需要对其进行操作的非事务性数据库会话状态丢失。

• 如果请求可以继续,则数据库和数据库会话必须是同步的。

但是,应用程序连续性可以替应用程序开发人员从事这类工作,从而以安全的

方式屏蔽许多中断。应用程序连续性通过设法屏蔽可以安全屏蔽的中断提高了

开发人员生产效率。

请注意,应用程序必须始终包含针对以下情况的错误处理能力:

• 不可恢复的错误,如无效的输入数据。(应用程序连续性适用于可恢复性

错误。)

• 可恢复性错误,但是重放遇到了一个列出的限制,如应用程序中使用了弃

用的 oracle.sql 具体类,或者,重放不能将客户端可见状态恢复到迄今客户

端可能已经对其做出决策的状态。

Page 5: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

4

应用程序连续性推出之前的体验

没有应用程序连续性时,数据库恢复不会屏蔽由网络中断、实例故障、硬件故

障、维修、配置更改、补丁等等导致的中断。

使用早期版本发生意外中断时的体验

图 1 说明了使用早期版本的体验:可能会向最终用户返回错误,甚至请求已完

成时也是如此。

1. 工作请求

2. DB 调用

4. 甚至在事务

已提交时也

会返回错误

数据库中断可能导致进行中的工作丢

失,使用户和应用程序疑惑不清:

• 用户收到错误

• 用户重新登录并重新输

入数据

• 重复提交请求

• 中间层计算机重新启动

3. 错误

早期的数据库版本

图 1 使用早期版本发生意外中断时的体验

对最终用户而言,数据库会话中断可能会对他们产生以下影响:

困惑:用户不知道他们的应用程序请求(如资金转账、订购、支付、预订等

等)出现了什么情况。

可用性降低:用户可能看到错误,可能丢失未提交的数据,并且可能需要重新

登录,然后重新输入或重新提交其数据。

中断:DBA 有时需要重新启动中间层计算机来处理负载平衡和涌入的登录风暴。

Page 6: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

5

使用早期版本发生计划中断时的体验

1. 工作请求

2. D B 调用

5. 向其余用户

发出错误

自 Database 10g 第 2 版以来,结合

使用 FAN 和 Oracle 池屏蔽了许

多计划操作

如果未结合使用 FAN 和 Oracle 池,

或者没有将会话返回到池中,则用

户和应用程序可能会看到中断。

4. 在等待后关闭

3. 服务重新定位

早期的数据库版本

图 2. 使用早期版本发生计划中断时的体验

计划中断比意外中断更为频繁。

自 Oracle Database 10g 第 2 版以来,对于使用 RAC、RAC One、Oracle Restart 和

Oracle Data Guard,并且结合使用 FAN 和 Oracle 连接池(Oracle WebLogic

Server 连接池、Oracle 通用连接池、Oracle JDBC 隐式连接缓存 (ICC)、

ODP.NET、OCI 会话池)的应用程序,计划中断已被屏蔽。

配置快速应用程序通知 (FAN) 和快速连接故障切换 (FCF)。

使用 SRVCTL 或 GDSCTL 来将服务从实例重新定位,或者,如果您正在使用

UNIFORM 服务,则关闭实例上的该服务。不要与任何这些命令一起使用 –

force 标记。

FAN 发送服务因计划的原因而关闭的通知。

在收到连接池发出的 FAN 事件时,将删除到已关闭服务的空闲连接,同时禁

止与该实例的进一步连接。对那些将自己的连接返回给连接池的应用程序,连

接池会自动在数据库请求边界终止连接。应用程序和用户看不到错误。其他实

例上的现有连接仍然可用,并根据需要对这些实例开启新连接。

所有应用程序都应该将其连接返回给连接池,但实际上并不总是这样。没有这

么做的应用程序可能在实例停止时遇到错误,从而导致糟糕的用户体验。

Page 7: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

6

Oracle Database 12c 中应用程序连续性的体验

图 3 说明了使用 Oracle Database 12c 时,对于使用应用程序连续性的应用程序

来说改善的用户体验。

• 在发生可恢复性错误时重放

正在执行的事务

• 屏蔽许多硬件、软件、网

络、存储错误和中断

• 提升最终用户体验和开发人

员生产效率

1. 工作请求

2. DB 调用

4. 重放

3. 错误

5. 响应

Oracle Database 12c

图 3. 使用应用程序连续性时的用户体验

重放成功后,应用程序连续性会屏蔽许多可恢复的数据库中断,使其不会被应

用程序及用户所察觉。它通过恢复数据库会话、整个会话(包括会话状态、游

标和变量)以及最后一个正在进行的事务(如果有)来实现屏蔽。

如果数据库会话由于可恢复性错误而变得不可用,则应用程序连续性将尝试重

新建立会话并将任何打开的事务恢复到正确状态。

如果事务成功提交,不需要重新执行,则会向应用程序返回成功的状态。

如果重放成功,则请求将安全地继续执行,不存在重复操作的风险。

如果重放不成功,则数据库拒绝该重放并且应用程序会收到原始错误。为能成

功重放,重放返回给客户端的数据必须与之前客户端在请求中收到的数据完全

相同,而且这些数据必须是应用程序当时决策时依据的数据。

Page 8: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

7

Oracle Database 12c 中的应用程序连续性

应用程序连续性覆盖的范围

Oracle Database 12c 的应用程序连续性支持以下客户端和服务器端特性:

Oracle Database 12c 客户端

Oracle JDBC Replay Driver 12c 或更高版本。这是随 Oracle Database 12c 一起为应

用程序连续性提供的 JDBC 驱动程序特性,下文称作―重放驱动程序‖。

Oracle 统一连接池、Oracle WebLogic Server 12c (12.1.2) 或更高版本,以及第三方

Java 连接池或单独的 Java 应用程序 — 使用 Oracle JDBC Replay Driver 12c 或更高

版本。

Oracle Database 12c 服务器端

使用 API beginRequest 和 endRequest 识别对数据库的数据库请求。(使用 Oracle

连接池时,识别请求是透明的。)

调用类型 — SELECT、PL/SQL、ALTER SESSION、DML、DDL、COMMIT、

ROLLBACK、SAVEPOINT、JDBC RPC 和本地 JDBC 调用

事务类型 — 本地、并行、远程、分布式和嵌入在 PL/SQL 内的事务

可变 Oracle 函数(参见附录 — 应用程序连续性涉及的新的数据库概念)

使用 Intel 和 Sparc 芯片的硬件上的硬件加速

应用程序连续性中的处理阶段

应用程序连续性使用三个不同的处理阶段,如表 1 所示。该处理在应用程序下

层的重放驱动程序和数据库中进行,对应用程序是透明的。

Page 9: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

8

表 1. 应用程序连续性的处理阶段

正常运行时

重新连接

重放

识别数据库请求

决定哪些可以重放,哪些不能

重放

创建代理对象

使用验证保持原始调用

确保为请求启用了重放

处理超时

创建新连接

验证目标数据库

使用事务防护来执行最终

结果

重放保留的调用

在重放过程中确保用户看到的结果

与原始情况相符

如果重放成功,则继续执行请求

如果重放不成功,则抛出原始异常

正常运行时 — 在正常运行时,每个数据库请求都标有请求开始和请求结束标

记,这是通过以下两种方式之一实现的:签出或签入 WebLogic Server 连接

池或通用连接池;在连接签出和签入时向您自己的应用程序或您自己的

Java 连接池添加开始和结束标记。

Oracle JDBC 重放驱动程序和 Oracle Database 12c 相互协作,决定请求中的

哪些调用可以重放。可重放的调用与从数据库接收到的验证一起由驱动程

序保持较长的时间。重放驱动程序将这些调用和验证信息一直保留到数据

库请求结束或重放被禁用。受限制的调用、提交(默认模式)、请求结束均

可使重放被禁用,重放也可被应用程序显式禁用。

重新连接 — 发生可恢复性错误时,由重放驱动程序触发应用程序连续性的重

新连接阶段。在这个阶段,对请求进行检查,看重放是否仍处于启用状

态,并对超过某个时间后就不再允许重放的超时进行检查,以确保没有超

过这个时间。假设这些检查都获得了通过,则会建立到数据库的新连接。

如果需要重新建立服务,则重新连接到数据库的过程会花些时间,因此

DBA 应检查服务的 FAILOVER_DELAY 和 FAILOVER_TIMEOUT 属性。

重放驱动程序建立了到数据库的连接之后,它会检查该连接是否连接到一

个有效的数据库目标,以及是否成功提交了最后一个事务(如果存在)。

如果连接到的是逻辑上不同的数据库,或者是逻辑上相同但已丢失了事务

的数据库,则将不会发生重放。例如,数据库已及时恢复正常。重放驱动

程序将不会重新提交已提交的事务。使用事务防护最多执行一次提交。

Page 10: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

9

重放 — 一旦建立了到数据库的新连接,重放阶段就会启动。重放驱动程序保

留的所有调用都被重放。重放期间,如果通过验证确定在观察结果中存在

任何用户可看到的更改,则禁用重放。重放不允许在重放阶段提交,但允

许最后一个调用提交。也就是遇到可恢复性错误的调用。重放成功后,请

求从自身失败的位置继续执行。

使用应用程序连续性时的限制

下面是使用应用程序连续性时在全局、本地和数据库三个级别存在的限制。

表 2. 应用程序连续性存在的三个级别的限制

全局

请求

目标数据库

不支持:

XA

弃用的 Java 具体类

默认数据库服务

对 Java 流,重放以“尽力而为”

为原则

在请求级对于 Active

Data Guard 的读写数据

库链接禁用该功能

在请求级对以下情况禁用

该功能

— 改变系统

— 改变数据库

不支持:

逻辑备用数据库

Golden Gate

全局 — 该限制可以防止对任何请求均启用和使用应用程序连续性。

对于使用 XA 开发的应用程序不支持重放。例如,部署到启用了 XA 的

WebLogic Server 上的 Java EE 应用程序。

对于使用 Oracle JDBC 驱动程序的应用程序,不支持弃用的 oracle.sql 具体

类 , 如 BLOB 、 CLOB 、 BFILE 、 OPAQUE 、 ARRAY 、 STRUCT 或

ORADATA。

对于使用数据库服务(即对应于 DB_NAME 或 DB_UNIQUE_NAME 的默

认服务)的连接不支持重放。数据库服务不是供高可用性应用程序使用

的,因为这类服务不能启用、禁用或故障切换。

请求 — 这一限制会对部分数据库请求禁用应用程序连续性。

对于 JDBC 流参数,重放以―尽力而为‖为原则。例如,如果应用程序正在

使用物理地址,则中断时该地址不再有效,无法被重新定位。

如果您正在使用 Active Data Guard 到另一个数据库的读写数据库链接,则不

支持重放。

Page 11: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

10

如果请求执行 ALTER SYSTEM 或 ALTER DATABASE 语句,则会禁用重

放。例如,重放将不会添加表空间,不会启动或关闭数据库。

目标数据库 — 应用程序连续性不支持故障切换到逻辑上不同的数据库 — 包

括 Oracle 逻辑备用数据库和 Oracle Golden Gate。重放对所适用的数据库有

严格的要求,这些数据库经验证应未丢失事务。

何时不会对请求使用重放

以下事件可以禁用对数据库请求的重放。如果重放被禁用,在下个请求开始时

会隐式重新启用。禁用重放不会影响正常的运行时或其他请求。只需停止验证

和记录,由重放驱动程序释放保留的调用。然而,一旦重放被禁用,则不会为

重放保护该请求。

表 3. 何时不会对应用程序使用重放

全局

请求

目标数据库

发生以下情况后,同一请求中的任

何调用:

以动态模式成功提交(默认)

受限的调用

disableReplay API

错误不可恢复

超时

— 重放启动超时

— 达到最大连接重试次数

— 每个事件达到最大重试次数

重放的目标数据库无效

最后一次调用以动态模式提交

验证检测到不同结果

正常运行时 — 在 beginRequest 标记处启用调用捕获。对所有初始调用实施捕

获,直到成功提交(以动态模式),除非遇到受限调用,或者应用程序执行

显式 disableReplay 调用。否则捕获将继续,直到遇到 endRequest 标记。

重新连接 — 出现以下情况时均不发生重放:错误不可恢复,超时限制超出

(参见“针对应用程序连续性配置服务”),目标数据库与原始数据库不同

或者不是原始数据库的祖先,请求已提交(以动态模式)。

重放 — 如果对要重放的调用的验证未通过,则中止重放并返回原始错误。重

放返回的用户可见的结果必须与应用程序已看到的结果完全相同,而且这

些结果必须是应用程序当时决策时依据的结果。

Page 12: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

11

可能的副作用

自主事务和外部 PL/SQL 操作可能产生与主数据库请求不相关的副作用。一些

产生副作用的数据库调用情形包括:自主事务、使用 DBMS_ALERT 调用发送

电子邮件或其他通知、使用 DBMS_PIPE 和 RPC 调用复制文件、使用

UTL_FILE 调用编写文本文件、使用 UTL_HTTP 调用执行 HTTP 调出、使用

UTL_MAIL 调用发送电子邮件、使用 UTL_SMTP 调用发送 SMTP 消息、使用

UTL_TCP 调用发送 TCP 消息、使用 UTL_URL 调用访问 URL。

具有副作用的调用可能留下持久的结果。例如,如果用户在进行了部分工作还

没有提交时就离开,而会话超时,或者用户发出 Ctrl + C 指令,前台或某个组

件出现故障;尽管副作用可能已经出现,但主事务仍然回滚。

除非应用程序另有指定,否则副作用会重放。必须对使用外部操作的应用程序

进行审查,以便决定是否应重放具有副作用的请求。如果请求含有不应重放的

外部操作,则应使用 disableReplay API 禁用对该请求的重放。所有其他请求将

继续重放。

应用程序所有者的评估

应用程序所有者的评估步骤

为应用程序启用应用程序连续性之前,应用程序所有者必须完成表 4 中所示

的评估步骤。

表 4. 应用程序开发人员的评估步骤

决策 如何处理

请求边界 如果没有使用 Oracle 连接池,则标记请求边界

JDBC 具体类 用 Java 接口替换弃用的具体类

决定禁用 如果数据库请求有不应重放的任何调用,则使用 disableReplay API

回调 如果请求外状态更改则确保回调已注册 (WebLogic Server 和通用连接池

标签都是自动的)

可变函数 如果这些与应用程序兼容,准许保持原始可变值

评估请求边界

如果应用程序没有使用 Oracle 连接池,或者没有将连接释放回 Oracle 连接池,

则标记请求边界。请求边界标记数据库请求的开始和结束。

Page 13: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

12

下面的流程图(图 5)显示了如何决定是否需要增加请求边界。

1) 首先确定应用程序是否从 WebLogic Server 连接池或通用连接池为每个请求

借用和返回了连接。如果答案是肯定的,并且在请求之间正在返回连接,

则不需要更改。

2) 如果应用程序正在使用这些 Oracle 池,但没在释放连接,通常有一个应用

程序属性要设置为释放连接。释放连接比不释放连接要获得更好的伸缩

性,并且无需其他更改即可标记请求边界。

3) 如果应用程序使用第三方 JDBC 连接池,或者使用独立的 JDBC,则添加

beginRequest 和 endRequest API 来标识数据库请求边界。这些 API 没有性能

开销,并且互相隔离以签出和签入自定义 JDBC 池。

WebLogic

或 UCP

应用程序将

连接返回到池

将连接返回

给池的属性

在请求

开始/结束处添加

beginRequest、

endRequest 标记

完成

完成

图 5. 要标识的数据库请求的决策流

删除 Oracle JDBC 具体类

确定应用程序是否使用 Oracle JDBC 具体类。要使用应用程序连续性,必须替

换弃用的 Oracle JDBC 具体类。有关弃用具体类的信息,以及若使用了弃用的

具体类则要采取的措施的信息,请参见 My Oracle Support 说明 1364193.1

(https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=1364193.1)

决定是否应该禁用任何请求

应用程序开发人员在启用重放时要慎重地作出决定。这对那些使用 UTL_HTTP

包或自主过程、实施序列化,或者依赖于中间层时钟时间的请求尤其重要。对

不应重放的任何请求要使用禁用重放 API (disableReplay)。

完成 将属性设置

为返回

Page 14: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

13

如果请求使用一个外部 PL/SQL 消息操作来执行外部调用,或者使用自主事

务,则要检查此请求。决定是否应重放该请求,如果不应重放,则禁用。

重放以并发方式独立地恢复会话。如果应用程序逻辑假设另有独立的数据库会

话被同步,则禁用重放。例如,如果应用程序使用诸如用户锁或外部设备等在

提交、回滚或会话丢失前保持的易变资源来同步会话,则不要使用重放。

如果请求依赖于执行逻辑的中间层的时间,请禁用重放。如果请求假设在时间

T1 执行的语句不会在时间 T2 重新执行,则禁用对该请求的重放。重放驱动程

序不重复中间层逻辑。它只重复作为该逻辑的一部分执行的数据库调用。

如果在请求之外设置状态,则注册回调

评估应用程序是否在数据库请求之外设置状态。如果用户启动请求时在该请求

之外设置了数据库会话状态,那么,为了重新执行调用,重放需要了解该状

态。选择以下回调方法之一:

通用连接池或 WebLogic Server 连接标签。

连接初始化回调

使用 Oracle WebLogic Server 或通用连接池时,建议使用连接标签。如果使用连

接标签,会对应用程序连续性自动使用这些标签。无需进行任何更改。

如果使用应用程序自己的回调,则在 WebLogic 管理控制台、或在通用连接

池、或 JDBC 重放驱动程序级别注册该回调。应用程序连续性将在重放时重新

执行该回调。仅当应用程序尚未实施连接标签且需要请求中未建立的状态时,

才使用连接初始化回调。

准许支持保持可变值

确定保持原始可变值是否与应用程序兼容,如果兼容,则为重放保持原始可变

值。可变函数是那些每次执行都可能返回一个新值的函数。针对 SYSDATE、

SYSTIMESTAMP、SYS_GUID 和 sequence.NEXTVAL 提供了对保持可变函数的

原始结果的支持。如果未保持原始值以及如果重放时向应用程序返回了不同的

值,则重放将被拒绝。

如果应用程序可以使用原始值,则使用 GRANT KEEP 为应用程序用户配置可

变对象,以及使用 KEEP 子句为序列所有者配置可变对象。当被授予 KEEP 特

权时,重放时重放将应用该原始函数结果。

Page 15: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

14

例如

GRANT [KEEP DATE TIME | KEEP SYSGUID]..[to USER]

GRANT KEEP SEQUENCE..[to USER] on [sequence object];

ALTER SEQUENCE..[sequence object] [KEEP|NOKEEP];

注意:

可变应用程序适用于本地数据库。它不会遍历数据库链接。如果下推至并行查

询子进程,它也不适用于 SYS_GUID。

配置应用程序连续性

在确认应用程序所有者批准了对应用程序使用重放后,就可以在客户端和服务

器端配置应用程序以使用重放,如图 6 中的任务栏中所示。

图 6. 配置应用程序连续性

配置 Oracle JDBC 12c 重放驱动程序

根据您的配置,选择以下方法之一:

配置 Oracle UCP 12c

配置 Oracle JDBC 12c 重放数据源作为 UCP PoolDataSource 上的连接工厂:

setConnectionFactoryClassName(―oracle.jdbc.replay.OracleDataSourceImpl‖);

配置 Oracle WebLogic Server 12c

使用 Oracle WebLogic Server 管理控制台配置 Oracle 12c JDBC 重放数据源,如下

面的图 7 所示。

Page 16: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

15

图 7. 将 WebLogic GridLink 数据源配置为启用 JDBC 重放

配置独立的 Java 应用程序或第三方连接池

在属性文件中或在瘦 JDBC 应用程序中配置 Oracle JDBC 12c 重放数据源:

replay datasource=oracle.jdbc.replay.OracleDataSourceImpl

配置连接以实现高可用性

以下设置是成功故障切换和回退所需要的:

数据库的 REMOTE_LISTENER 设置必须在 ADDRESS_LIST 中包括用于客户端

连接的所有 URL 的地址:

如果有任何 URL 使用 SCAN 名称,则 REMOTE_LISTENERS 必须包括该

SCAN 名称。

如 果 有 任 何 URL 使 用 主 机 VIP 的 ADDRESS_LIST , 则

REMOTE_LISTENERS 必须包括含有所有 SCAN VIP 和所有主机 VIP 的

ADDRESS 列表。

在 URL 中设置 RETRY_COUNT、CONNECT_TIMEOUT

和 TRANSPORT_CONNECT_TIMEOUT 参数,以允许重试新传入的连接。

这是从 Oracle Database 11.2.0.2 开始的配置 JDBC 瘦驱动程序连接的一个通常

的建议。

示例:

"jdbc:oracle:thin:@(DESCRIPTION

=(TRANSPORT_CONNECT_TIMEOUT=3)(CONNECT_TIMEOUT=60)(RETRY_COUNT=3)

(FAILOVER=ON)(ADDRESS_LIST =(ADDRESS=(PROTOCOL=tcp)(HOST=CLOUD-

SCANVIP.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=GOLD)))

Page 17: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

16

alter system set Remote_listeners=CLOUD-SCANVIP.example.com:1521"

针对应用程序连续性配置服务

要使用应用程序连续性,根据您的系统配置,使用 SRVCTL 或 GDSCTL 或

DBMS_SERVICE 其中之一设置服务属性:FAILOVER_TYPE:将该属性设置为

TRANSACTION 以启用应用程序连续性 COMMIT_OUTCOME:将该属性设置

为 TRUE 以启用事务防护(强制)

还要检查以下服务属性:

REPLAY_INITIATION_TIMEOUT:将该属性设置为一个以秒计的时间间隔,

经历该时间间隔后重放仍未启动,如 180、300、1800 秒,则代之以取消重

放。此计时器从 beginRequest 开始启动。(默认为 300 秒)

FAILOVER_RETRIES:设置该属性以指定每个重放尝试的连接重试次数。(默

认为重试 30 次,应用于重放驱动程序)

FAILOVER_DELAY:设置该属性以指定每次连接重试间的时间间隔(以秒

计)(默认为 10 秒,应用于重放驱动程序)

AQ_HA_NOTIFICATIONS:将该属性设置为 TRUE 以启用 FAN(默认为

TRUE)

示例

要使用 SRVCTL 来修改服务属性,请使用类似于以下的命令,其中 EMEA 是

Oracle 数据库的名称,GOLD 是服务的名称:

srvctl modify service -db EMEA -service GOLD -failovertype TRANSACTION

-replay_init_time 300 -failoverretry 30 -failoverdelay 3 -notification TRUE

-commit_outcome TRUE

要使用 DBMS_SERVICE 包,用以下方式修改服务属性:

declare

params dbms_service.svc_parameter_array; begin

params('FAILOVER_TYPE'):='TRANSACTION';

params('REPLAY_INITIATION_TIMEOUT'):=300;

params('FAILOVER_DELAY'):=3;

params('FAILOVER_RETRIES'):=30;

params('commit_outcome'):='true';

params('aq_ha_notifications'):='true';

dbms_service.modify_service('[your service]',params);

end;

Page 18: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

17

检查资源分配

确保系统有必要的内存和 CPU 资源。

内存:JDBC 重放驱动程序使用的内存比基本 JDBC 驱动程序使用的要多,因为

调用要保留到数据库请求结束。如果保留的调用数很少,则重放驱动程序

占用的内存与基本驱动程序大致相当。请求结束时,这些调用释放给垃圾

收集器。这一操作与基本驱动程序不同,后者当调用关闭时才将其释放。

为实现良好的性能,如果有足够的内存,请为虚拟机 (VM) 分配 4 到 8 GB

(或更多)的内存,例如,通过设置 -Xms4096m 来分配 4 GB 内存。

CPU:JDBC 重放驱动程序使用一些额外的 CPU 来构建代理对象、管理队列以

及进行垃圾回收。服务器使用一些额外的 CPU 来管理验证。对配有最新

Intel 和 Sparc 芯片的平台,数据库端的 CPU 开销有所减少。

管理

计划停机

对于计划停机,建议的方法是通过 FAN 来排出对 Oracle 连接池的请求,同时

对那些在分配时间内未完成的请求结合使用应用程序连续性。

使用带有 NO 强制标记的 RELOCATE 或 STOP 命令,FAN 计划事件会立即清

除空闲会话,并标记活动会话以便使其在签入时(请求结束时)被释放。FAN

事件会让大多数会话从实例中排出,而不会中断工作。(参见使用早期版本发

生计划中断时的体验)。

如果并非所有会话都已签入,而停止实例的时间已到,则停止实例(中止)。

如果配置了应用程序连续性,则应用程序连续性将尝试恢复那些保留的会话。

终止或断开会话,不重放

如果配置了应用程序连续性,并且,DBA 终止或断开了会话,应用程序连续

性会尝试恢复会话。但是,如果您不希望重放会话,请使用 NOREPLAY 关

键字:

alter system kill session 'sid, serial#, @inst' noreplay;

alter system disconnect session 'sid, serial#, @inst' noreplay;

execute DBMS_SERVICE.DISCONNECT_SESSION(‗[service name]‘,

DBMS_SERVICE.NOREPLAY) ;

Page 19: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

18

总结

应用程序连续性尝试通过在发生可恢复性中断后重放未完成的数据库请求来屏

蔽中断,使中断不被应用程序和最终用户所觉察。该功能可以屏蔽很多中断。

因而减少了对应用程序错误处理逻辑的调用,也就是说,与以往相比较少出现

以下情况:应用程序向用户发出错误信息;让用户不知道发生了什么;或者强

迫用户重新输入数据;或者更糟的是,管理员必须重新启动中间层服务器以应

对故障,等等。应用程序连续性增强了使用 Oracle 数据库的系统和应用程序的

容错性。

Page 20: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

19

附录 — 应用程序连续性涉及的新的数据库概念

应用程序连续性使用下列术语和概念

可恢复性错误(增强)

可恢复性错误是因外部系统故障而引起的错误,与执行的应用程序会话逻辑无

关。可恢复性错误发生在计划或意外的前台、网络、节点、存储或数据库中断

之后。应用程序会收到一个错误代码,这可能让应用程序不知道上次提交操作

的状态。Oracle Database 12c 中增强了对可恢复性错误的处理,从而包括更多的

错误,并包括一个用于 OCI 的公共 API。

应用程序在其代码中应不会再列出错误号。出现可恢复性错误代码后就调用应

用程序连续性。

可靠的提交结果

从客户端的角度看,当客户端收到一条称为 Commit Outcome 的 Oracle 消息时

就意味着事务已提交,该 Oracle 消息是在写入事务重做后生成的。然而,

COMMIT 消息并不持久。在发生可恢复性错误后,Commit Outcome 消息原本

可能已丢失,但应用程序连续性通过使用 Oracle Database 12c 事务防护能够在

这种情况下可靠地获得 Commit Outcome 消息。

数据库请求

数据库请求是应用程序所提交的工作的一个单元。它通常对应于 SQL 和

PL/SQL、数据库 RPC 调用和一个数据库连接上的单个 web 请求的本地客户端

调用。一般通过从连接池签出和签入数据库连接的调用来界定数据库请求。对

可恢复性错误,应用程序连续性重新建立数据库会话并安全地重复未提交的数

据库请求。

通常,使用 JDBC 的数据库请求遵循标准模式。下图是一个代码片段,其中显

示设计了多少个数据库请求。

1. 数据库请求始于 PoolDatasource 上的一个 getConnection 调用。

2. 执行应用程序逻辑。这可能包括执行 SQL、PL/SQL、RPC 或本地调用。

3. 提交事务。

4. 当连接返回给连接池时该数据库请求结束。

Page 21: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

ORACLE Database 12c 中的应用程序连续性

20

PoolDatasource pds = GetPoolDataSource();

Connection conn = getConnection(pds);

conn.setAutoCommit(false);…

ResultSet rs1 = pstmt1.executeQuery();…

数据库

请求开始

CallableStatement cstmt = conn.prepareCall(plsql1);

cstmt.setInt(1,1);

cstmt.execute();

PreparedStatement pstmt2 = conn.prepareStatement(query2….

ResultSet rs2 = pstmt2.executeQuery();

If (rs2!=null) {

while rs2.Next()) {…//fetch from rs2

rs2.close(); pstmt2.close();

SQL、PL/SQL、

RPC、本地调用

conn.commit();

conn.close();

大多数请求中 最后都是

COMMIT

数据库 请求结束

可变函数

图 4. 数据库请求示例

可变函数是那些每次调用都可能改变其结果的函数。因为重放时客户端所见到

的结果可能会改变,因此可变函数可能会导致重放被拒绝。请考虑键值中常使

用的 sequence.NEXTVAL 函数。如果主键含有一个序列值,后来该值被用在外

键或其他绑定中,则重放时必须返回相同的函数结果。

如果配置了 GRANT KEEP 或 ALTER..KEEP,则应用程序连续性会在重放时为

Oracle 函数调用提供可变值替换。如果调用使用支持保留原始可变值的数据库

函数,包括 sequence.NEXTVAL、SYSDATE、SYSTIMESTAMP 和 SYS_GUID,

那么,从函数执行返回的原始值可以保存下来,并在重放时应用该值。如果应

用程序决定不准许可变支持,并且重放时向客户端返回了不同的结果,则这些

请求的重放将被拒绝。

Page 22: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

甲骨文(中国)软件系统有限公司

北京远洋光华中心办公室

地址:北京市朝阳区景华南街5号远洋光华中心C座21层

邮编:100020

电话:(86.10) 6535-6688

传真:(86.10) 6515-1015

北京汉威办公室

地址:北京市朝阳区光华路7号汉威大厦10层1003-1005单元

邮编:100004

电话:(86.10) 6535-6688

传真:(86.10) 6561-3235

北京甲骨文大厦

地址:北京市海淀区中关村软件园24号楼甲骨文大厦

邮编:100193

电话:(86.10) 6106-6000

传真:(86.10) 6106-5000

北京国际软件大厦办公室

地址:北京市海淀区中关村软件园9号楼国际软件大厦二区308单元

邮编:100193

电话:(86.10) 8279-8400

传真:(86.10) 8279-8686

北京孵化器办公室

地址:北京市海淀区中关村软件园孵化器2号楼A座一层

邮编:100193

电话:(86.10) 8278-6000

传真:(86.10) 8282-6401

上海名人商业大厦办公室

地址:上海市黄浦区天津路155号名人商业大厦12层

邮编:200001

电话:(86.21) 2302-3000

传真:(86.21) 6340-6055

上海腾飞浦汇大厦办公室

地址:上海市黄浦区福州路318号腾飞浦汇大厦508-509室

邮编:200001

电话:(86.21) 2302-3000

传真:(86.21) 6391-2366

上海创智天地10号楼办公室

地址:上海市杨浦区凇沪路290号创智天地10号楼512-516单元

邮编:200433

电话:(86.21) 6095-2500

传真:(86.21) 6107-5108

上海创智天地11号楼办公室

地址:上海市杨浦区淞沪路303号创智天地科教广场3期11号楼7楼

邮编:200433

电话:(86.21) 6072-6200

传真:(86.21) 6082-1960

上海新思大厦办公室

地址:上海市漕河泾开发区宜山路926号新思大厦11层

邮编:200233

电话:(86.21) 6057-9100

传真:(86.21) 6083-5350

广州国际金融广场办公室

地址:广州市天河区珠江新城华夏路8号合景国际金融广场18楼

邮编:510623

电话:(86.20) 8513-2000

传真:(86.20) 8513-2380

成都中海国际中心办公室

地址:成都市高新区交子大道177号中海国际中心7楼B座02-06单元

邮编:610041

电话:(86.28) 8530-8600

传真:(86.28) 8530-8699

深圳飞亚达科技大厦办公室

地址:深圳市南山区高新南一道飞亚达科技大厦16层

邮编:518057

电话:(86.755) 8396-5000

传真:(86.591) 8601-3837

深圳德赛科技大厦办公室

地址:深圳市南山区高新南一道德赛科技大厦8层0801-0803单元

邮编:518057

电话:(86.755) 8660-7100

传真:(86.755) 2167-1299

大连办公室

地址:大连软件园东路23号大连软件园15号楼502

邮编:116023

电话:(86.411) 8465-6000

传真:(86.755) 8465-6499

苏州办公室

地址:苏州工业园区星湖街328号苏州国际科技园5期11幢1001室

邮编:215123

电话:(86.512) 8666-5000

传真:(86.512) 8187-7838

沈阳办公室

地址:沈阳市和平区青年大街390号皇朝万鑫国际大厦A座39层3901&3911室

邮编:110003

电话:(86.24) 8393-8700

传真:(86.24) 2353-0585

济南办公室

地址:济南市泺源大街150号中信广场11层1113单元

邮编:250011

电话:(86.531) 6861-1900

传真:(86.531) 8518-1133

南京办公室

地址:南京市玄武区洪武北路55号置地广场19层1911室

邮编:210018

电话:(86.25) 8579-7500

传真:(86.25) 8476-5226

西安办公室

地址:西安市高新区科技二路72号西安软件园零壹广场主楼1401室

邮编:710075

电话:(86.29) 8834-3400

传真:(86.25) 8833-9829

Page 23: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

重庆办公室

地址:重庆市渝中区邹容路68号大都会商厦1611室

邮编:400010

电话:(86.23) 6037-5600

传真:(86.23) 6370-8700

杭州办公室

地址:杭州市西湖区杭大路15号嘉华国际商务中心810&811室

邮编:310007

电话:(86.571) 8168-3600

传真:(86.571) 8717-5299

福州办公室

地址:福州市五四路158号环球广场1601室

邮编:350003

电话:(86.591) 8621-5050

传真:(86.591) 8801-0330

青岛办公室

地址:青岛市香港中路76号颐中皇冠假日酒店909室

邮编:266071

电话:(86.532) 8571-8888

传真:(86.591) 8571-6666

南昌办公室

地址:江西省南昌市西湖区沿江中大道258号

皇冠商务广场10楼1009室

邮编:330025

电话:(86.791) 8612-1000

传真:(86.791) 8657-7693

呼和浩特办公室

地址:内蒙古自治区呼和浩特市新城区迎宾北路7号

大唐金座19层北侧1902-1904室

邮编:010051

电话:(86.471) 3941-600

传真:(86.471) 5100-535

郑州办公室

地址:河南省郑州市中原区中原中路220号

裕达国际贸易中心A座2015室

邮编:450007

电话:(86.371) 6755-9500

传真:(86.371) 6797-2085

武汉办公室

地址:武汉市江岸区中山大道1628号

武汉天地企业中心5号大厦23层2301单元

邮编:430010

电话:(86.27) 8221-2168

传真:(86.27) 8221-2168

长沙办公室

地址:长沙市芙蓉区韶山北路159号通程国际大酒店1311-1313室

邮编:410011

电话:(86.731) 8977-4100

传真:(86.731) 8425-9601

石家庄办公室

地址:石家庄市中山东路303号石家庄世贸广场酒店14层1402室

邮编:050011

电话:(86.311) 6670-8080

传真:(86.311) 8667-0618

昆明办公室

地址:昆明市三市街六号柏联广场写字楼11层1103A室

邮编:650021

电话:(86.871) 6402-4600

传真:(86.871) 6361-4946

合肥办公室

地址:安徽省合肥市蜀山区政务新区怀宁路1639号平安大厦18层1801室

邮编:230022

电话:(86.551) 6595-8200

传真:(86.551) 6371-3182

南宁办公室

地址:广西省南宁市青秀区民族大道136-2号华润大厦B座2302室

邮编:530028

电话:(86.771) 391-8400

传真:(86.771) 577-5500

Page 24: Oracle Database 12c 中的应用程序连续性...ORACLE Database 12c 中的应用程序连续性 5 1 多计划操作 使用早期版本发生计划中断时的体验. 工作请求

Oracle Database 12c 中的应用程序连续性

2013 年 6 月

作者:Carol Colrain

参与编著:Tong Zhou, Nancy Ikeda,

Stefan Roesch, Jean de Lavarene, Kevin Neel

公司网址:http://www.oracle.com(英文)

中文网址:http://www.oracle.com/cn(简体中文)

销售中心:800-810-0161

售后服务热线:800-810-0366

培训服务热线:800-810-9931

欢迎访问:

http://www.oracle.com(英文)

http://www.oracle.com/cn(简体中文)

版权© 2014 归 Oracle 公司所有。未经允许,不得以任何

形式和手段复制和使用。

本文的宗旨只是提供相关信息,其内容如有变动,恕不另

行通知。Oracle 公司对本文内容的准确性不提供任何保证,

也不做任何口头或法律形式的其他保证或条件,包括关于

适销性或符合特定用途的所有默示保证和条件。本公司特

别声明对本文档不承担任何义务,而且本文档也不能构成

任何直接或间接的合同责任。未经 Oracle 公司事先书面许

可,严禁将此文档为了任何目的,以任何形式或手段(无论

是电子的还是机械的)进行复制或传播。

Oracle 是 Oracle 公司和/或其分公司的注册商标。其他名

字均可能是各相应公司的商标。