但当您使用的数据库与 web 服务器位于不同的计算机上时,缓存数据库结果集通常是一个不错的方法。不过,根据您的情况确定最佳的缓存策略却是一个难题。例如,对于使用最新数据库结果集比较重要的应用程序而言,时间触发的缓存方法(缓存系统常用的方法,它假设每次到达失效时间戳记时就重新生成缓存)可能并不是一个令人满意的解决方案。这种情况下,您需要采用一种机制,每当应用程序需要缓存的数据库数据发生更改时,该机制将通知该应用程序,以便该应用程序将缓存的过期数据与数据库保持一致。这种情况下使用“数据库更改通知”将非常方便。
“数据库更改通知”入门
“数据库更改通知”特性的用法非常简单:创建一个针对通知执行的通知处理程序 – 一个 pl/sql 存储过程或客户端 oci 回调函数。然后,针对要接收其更改通知的数据库对象注册一个查询,以便每当事务更改其中的任何对象并提交时调用通知处理程序。通常情况下,通知处理程序将被修改的表的名称、所做更改的类型以及所更改行的行 id(可选)发送给客户端监听程序,以便客户端应用程序可以在响应中执行相应的处理。
为了了解“数据库更改通知”特性的作用方式,请考虑以下示例。假设您的 php(做为现在的主流开发语言) 应用程序访问 oe.orders 表中存储的订单以及 oe.order_items 中存储的订单项。鉴于很少更改已下订单的信息,您可能希望应用程序同时缓存针对 orders 和 order_items 表的查询结果集。要避免访问过期数据,您可以使用“数据库更改通知”,它可让您的应用程序方便地获知以上两个表中所存储数据的更改。
您必须先将 change notification 系统权限以及 execute on dbms_changenotification 权限授予 oe 用户,才能注册对 orders 和 order_items 表的查询,以便接收通知和响应对这两个表所做的 dml 或 ddl 更改。为此,可以从 sql 命令行工具(如 sql*plus)中执行下列命令。
connect / as sysdba;
grant change notification to oe;
grant execute on dbms_change_notification to oe;
确保将 init.ora 参数 job_queue_processes 设置为非零值,以便接收 pl/sql 通知。或者,您也可以使用下面的 alter system 命令:
alter system set job_queue_processes=2;然后,在以 oe/oe 连接后,您可以创建一个通知处理程序。但首先,您必须创建将由通知处理程序使用的数据库对象。例如,您可能需要创建一个或多个数据库表,以便通知处理程序将注册表的更改记录到其中。在以下示例中,您将创建 nfresults 表来记录以下信息:更改发生的日期和时间、被修改的表的名称以及一个消息(说明通知处理程序是否成功地将通知消息发送给客户端)。
connect oe/oe;
create table nfresults (
operdate date,
tblname varchar2(60),
rslt_msg varchar2(100)
);
在实际情况中,您可能需要创建更多表来记录通知事件以及所更改行的行 id 等信息,但就本文而言,nfresults 表完全可以满足需要。
使用 utl_http 向客户端发送通知
您可能还要创建一个或多个 pl/sql 存储过程,并从通知处理程序中调用这些存储过程,从而实现一个更具可维护性和灵活性的解决方案。例如,您可能要创建一个实现将通知消息发送给客户端的存储过程。“清单 1”是 pl/sql 过程 sendnotification。该过程使用 utl_httppl 程序包向客户端应用程序发送更改通知。
清单 1. 使用 utl_http 向客户端发送通知
http://www.bkjia.com/phpjc/508614.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/508614.htmltecharticle众所周知,缓存数据库查询的结果可以显着缩短脚本执行时间,并最大限度地减少数据库服务器上的负载。如果要处理的数据基本上是静态...
