我可以设置更改或添加表中某些行的钩子,并在发生此类事件时以某种方式收到通知吗?我发现了网络,但只被管道困住了。但是没有办法在发送管道消息时立即获取它。只有期刊尝试接收。
通常应该避免从数据库实现观察者模式。
为什么?它依赖于供应商专有(非标准)技术,促进数据库供应商锁定和支持风险,并导致一些膨胀。从企业的角度来看,如果不以受控方式完成,它可能看起来像“臭鼬工厂”——以不寻常的方式实现应用程序和集成模式和工具通常涵盖的行为。如果在细粒度级别实现,可能会导致微小的数据变化与大量不可预测的通信和处理紧密耦合,从而影响性能。机器中的额外齿轮可能是额外的断点 - 它可能对操作系统、网络和安全配置敏感,或者供应商技术中可能存在安全漏洞。
如果您正在观察由您的应用管理的交易数据:
- 在您的应用程序中实现观察者模式。例如。在 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)
- 避免使用数据库扩展基础设施,例如管道或高级队列
如果您使用消息传递(发送或接收),请从您的应用程序执行此操作。来自数据库的消息有点反模式。作为最后的手段,可以使用调用 Web 服务的触发器(http://www.oracle.com/technetwork/developer-tools/jdev/dbcalloutws-howto-084195.html http://www.oracle.com/technetwork/developer-tools/jdev/dbcalloutws-howto-084195.html),但是需要非常小心地以非常粗略的方式执行此操作,在一组数据更改时调用业务(子)流程,而不是处理细粒度的 CRUD 类型操作。最好触发作业并让作业在事务之外调用 Web 服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)