通过Oracle 数据库适配器,客户端程序可以从 Oracle 数据库接收消息,通知它们对存储在 Oracle 数据库中的数据的更改。 Oracle 数据库适配器支持接收“基于轮询的”消息,其中适配器在包中执行指定的 SELECT 查询、存储过程、函数或过程或函数,检索数据,并定期向客户端提供结果。 若要启用此功能,Oracle 数据库适配器会公开 POLLINGSTMT 操作。 此外,包中的所有存储过程、函数、过程和函数都公开为用于轮询的入站操作。
适配器提供两种轮询 Oracle 数据库的方法:
- 使用 SELECT 语句。 可以指定一个简单的 SELECT 语句来轮询 Oracle 数据库中的表和视图。 适配器按指定的时间间隔执行 SELECT 语句,并将结果返回给适配器客户端。 
- 在包中使用存储过程、函数或过程或函数。 可以在包中指定存储过程、函数或过程或函数来轮询 Oracle 数据库。 适配器按指定的时间间隔执行请求消息,并将结果返回给适配器客户端。 
轮询操作工作流
使用 Oracle 数据库适配器的典型轮询操作涉及以下内容:
- 适配器客户端必须在 InboundOperationType 绑定属性中指定轮询作为入站操作。 此绑定属性的默认值为 Polling。 
- 适配器客户端必须为 PolledDataAvailableStatement 绑定属性指定 SELECT 语句,以确定是否有可用于轮询的数据。 执行此语句时,如果返回的结果集的第一行的第一列包含正整数值,则有可用于轮询的日期。 默认情况下,此绑定属性的值设置为 - Select 1 FROM DUAL,这意味着无论要轮询的表是否包含数据,适配器都必须继续轮询。
- 适配器客户端必须为 PollingInterval 绑定属性指定轮询间隔,以定义执行 PolledDataAvailableStatement 绑定属性中指定的语句的间隔(以秒为单位)。 在每个轮询间隔结束时,将执行轮询的数据可用语句,并返回结果集。 
- 适配器客户端必须为 PollingStatement 绑定属性指定 SELECT 语句或存储过程。 - 如果要轮询表或视图,则必须在此绑定属性中指定 SELECT 查询。 
- 如果要在包中使用存储过程、函数或过程或函数进行轮询,则必须为此绑定属性中的相应操作指定整个请求消息。 - 仅当有可用于轮询的数据(由步骤 1 中的 PolledDataAvailableStatement 绑定属性确定)时,才会执行 PollingStatement 绑定属性中的语句。 
 
- 适配器客户端必须在 PollingAction 绑定属性中为轮询操作指定操作。 特定操作的轮询操作取决于使用使用适配器服务加载项为操作生成的元数据。 - 注意 - 如果使用 PollingStatement 绑定属性中的 SELECT 语句轮询表或视图,则无需为 PollingAction 绑定属性指定任何值。 在这种情况下,将传递默认值 Null。 
- 适配器客户端可以使用 PollWhileDataFound 绑定属性忽略轮询间隔,并在可用时连续轮询数据。 - 重要 - 如果将 PollWhileDataFound 绑定属性的值设置为 True,适配器客户端会持续轮询来自 Oracle 的数据,并在此过程中以循环方式打开和关闭与 Oracle 数据库的连接。 由于 ODP.NET 打开连接的速率大于正在关闭的连接,因此连接会在一段时间后耗尽,并引发异常。 解决方法是,确保 UseOracleConnectionPool 的值设置为 True,并在 IncrPoolSize 绑定属性中提及适当的值来控制适配器客户端可以打开的连接数。 
- 适配器客户端可以为 PostPollStatement 绑定属性指定轮询后语句(Oracle PL/SQL 块)。 在执行 PollingStatement 绑定属性中指定的语句之后,将执行此绑定属性中指定的语句。 - 适配器将轮询语句和轮询后语句包装在事务中,事务超时值设置为为 PollingInterval 绑定属性指定的值。 因此,必须指定大于或等于处理传入消息和发送答复所需的时间的超时值。 如果客户端程序使用消息或执行轮询后查询所花费的时间超过超时值,则会回滚事务。 如果花费的时间小于超时值,适配器将提交事务,并在执行下一次轮询之前在轮询中的剩余时间“休眠”。 - 适配器禁止来自 Oracle 数据库的任何空轮询响应。 
轮询和通知之间的差异
尽管轮询和通知都是入站操作,并通知适配器客户端有关 Oracle 数据库中的数据更改,但下表说明了两者之间的一些差异。 以下差异将帮助你根据要求决定操作:
| 轮询 | 通知 | 
|---|---|
| Oracle 数据库适配器支持的所有 Oracle 数据库版本都支持轮询。 | 仅 Oracle 数据库版本 10.2 及更高版本支持通知。 | 
| 可以将轮询间隔配置为检查可用于定期轮询的数据,也可以在数据可用时立即进行轮询。 提示: 在数据更改持续发生且不希望每次更改发生时收到通知的情况下,轮询可以提供更好的吞吐量。 而是指定一个轮询间隔,在此间隔后,你将收到自上次更改通知以来发生的所有更改的通知。 | 数据更改通知始终是即时的。 | 
| 轮询由适配器启动。 适配器执行 SQL 语句来验证数据是否可用于轮询,如果某些数据可用于轮询,则通过执行轮询语句来启动轮询。 | 通知由 Oracle 数据库启动。 适配器发出的通知语句只是指示数据库在语句的结果集中发生更改时启动通知。 通知是 Oracle 数据库的一项功能。 | 
| 可以使用轮询语句读取或更新 Oracle 数据库中的数据。 | 可以使用 notification 语句仅读取 Oracle 数据库中的数据。 | 
| 轮询会通知你已更改的实际数据。 | 通知仅通知数据中的更改类型,例如插入、更新和删除。 | 
详细信息:
- 适配器如何支持从 Oracle 数据库接收基于轮询的消息,请参阅 接收基于轮询的数据更改消息。 
- 使用 BizTalk Server 从 Oracle 数据库接收基于轮询的消息,请参阅使用 Biztalk Server 在 Oracle 数据库中调用函数和过程。 
- 使用 WCF 服务模型从 Oracle 数据库接收基于轮询的消息,请参阅使用 WCF 通道模型从SQL Server接收基于轮询的数据更改的消息。 
- 使用 WCF 通道模型从 Oracle 数据库接收基于轮询的消息,请参阅使用 WCF 通道模型从SQL Server接收基于轮询的数据更改的消息。 
- 用于执行轮询查询的消息结构和 SOAP 操作,请参阅 轮询操作的消息架构。