Oracle中的观察者模式

时间:2013-04-18 10:06:18

标签: database oracle design-patterns plsql pipe

我可以在更改或添加表格中的某些行时设置挂钩,并在此类事件进行评估时得到通知吗?我发现网络,只是卡在管道上。但是在发送时无法立即获取管道消息。只有期刊才会收到。

5 个答案:

答案 0 :(得分:7)

通常应避免从数据库实现Observer模式。

为什么呢?它依赖于供应商专有(非标准)技术,促进数据库供应商锁定和支持风险,并导致一些膨胀。从企业的角度来看,如果不是以受控的方式完成,它可能看起来像“skunkworks” - 以一种不寻常的方式实现应用程序和集成模式和工具通常涵盖的行为。如果在细粒度级别实现,则可能导致与微小数据更改的紧密耦合,同时存在大量不可预测的通信和处理,从而影响性能。机器中的额外齿轮可能是一个额外的突破点 - 它可能对O / S,网络和安全配置很敏感,或者供应商技术中可能存在安全漏洞。

如果您正在观察应用管理的交易数据:

  • 在您的应用中实施观察者模式。例如。在Java中,CDI和javabeans规范直接支持这一点,根据Gang Of Four书的OO定制设计是一个完美的解决方案。
  • 可选择向其他应用发送消息。过滤器/拦截器,MDB消息,CDI事件和Web服务对于通知也很有用。

如果用户直接修改数据库中的主数据,则:

  • 在您的应用中提供单一管理页面以控制主数据刷新或
  • 提供单独的主数据管理应用程序并向依赖应用程序发送消息或
  • (最佳方法)管理主要数据编辑的质量(评论,测试等)和时间(与代码更改相同),通过环境进行推广,部署和刷新数据/重新启动应用程序到托管结构

如果您正在观察由另一个应用程序管理的事务数据(共享数据库集成),或者您使用数据级集成(如ETL)为您的应用程序提供数据:

  • 尝试让数据实体只由一个应用程序编写(其他人只读)
  • 轮询暂存/ ETL控制表以了解发生更改的时间或
  • 使用JDBC / ODBC级专有扩展来进行通知或轮询,并在Alex Poole的回答中提及或
  • 重构从2个应用程序到共享SOA服务的重叠数据操作可以避免观察要求或将其从数据操作提升到更高级别的SOA /应用程序消息
  • 使用ESB或数据库适配器调用应用程序进行通知,或使用WS端点进行批量数据传输(例如Apache Camel,Apache ServiceMix,Mule ESB,Openadaptor)
  • 避免使用数据库扩展基础结构,例如管道或高级排队

如果您使用消息(发送或接收),请从您的应用程序执行此操作。来自DB的消息传递有点像反模式。作为最后的手段,可以使用调用Web服务的触发器(http://www.oracle.com/technetwork/developer-tools/jdev/dbcalloutws-howto-084195.html),但需要非常小心地以非常粗略的方式执行此操作,在一组数据时调用业务(子)进程改变,而不是处理细粒度的CRUD类型的操作。最好触发一项工作并让工作在交易之外调用Web服务。

答案 1 :(得分:4)

除了其他答案,您还可以查看database change notification。如果您的应用程序是基于Java的,那么有针对JDBC的特定文档,以及类似于.NET herehere的文档。还有另一篇文章here

您还可以查看可以在OCI中使用的continuous query notification

我知道仅限链接的答案并不好但我没有经验可以写任何东西(我必须承认我没有使用过,但我一直想看看DCN一段时间现在......)这对评论来说太长了* 8 - )

答案 2 :(得分:3)

在数据库本身内,触发器就是您所需要的。插入,删除,更新或组合数据时,可以运行任意PL / SQL。

如果您需要将事件传播到数据库之外,则需要一种从PL / SQL触发器调用外部应用程序的方法。一些可能的选择是:

  1. DBMS_PIPES - Oracle中的管道类似于Unix管道。一个会话可以写入,单独的会话可以读取以传输信息。此外,它们不是事务性的,因此您可以立即获得消息。一个缺点是API是基于民意调查的,所以我建议选项#2。
  2. Java - PL / SQL可以调用任意Java(假设您将类加载到数据库中)。这打开了大门,可以执行任何类型的消息传递,包括使用JMS将消息推送到消息队列。根据您的实现方式,您甚至可以将其与事务绑定INSERT / UPDATE / DELETE语句本身。然后,侦听应用程序将只监听JMS队列,并且它根本不会与发布事件的DB绑定。

答案 3 :(得分:2)

根据您的要求,使用triggersauditing

答案 4 :(得分:2)

查看DBMS_ALERT,DBMS_PIPE或(最好) AQ(高级排队)它是Oracle的内部邮件系统。 Oracle的AQ有自己的API,但也可以像Java JMS提供者那样对待。

还有Stream或(XStream)等技术,但这些技术非常复杂。