我有一个要求,只要表中有一个条目,我就想触发一个事件。我为此使用了EntityListeners(Spring Data JPA概念),它运行得非常好;但这里的问题是,插入可以通过存储过程或手动输入进行。我试着在网上搜索,发现了SpringJPA入站和出站通道适配器的概念,但我认为这个概念对我想要实现的目标没有太大帮助。有人能向我澄清这个概念是否对我有帮助吗?因为我对这个概念没有太多想法,或者为我提供如何实现这一目标的任何解决方案?
没有"伟大的";引发事件的机制";从数据层";在SQL Server中。
有三个";OK";其中:
- 触发器(只能说是OK)
触发器似乎是一个显而易见的解决方案,但你必须问问自己。。。触发器实际会做什么?如果它只是将数据写入另一个表,那么您仍然没有脱离数据库。你可以尝试使用各种神秘的技巧,比如CLR过程或一些扩展过程。
但是,如果你走上这条路,你必须开始考虑另一个问题:触发器与导致它们启动的DML操作发生在同一事务中。如果它们需要时间来执行,那么您将降低OLTP工作负载的速度。如果他们做了任何可能不可靠的事情,他们可能会失败,导致您的事务回滚。
- 触发器和service broker
Service broker提供了一种机制-也许是唯一一种半明智的机制-将您的数据从SQL中取出,并放入";"推";基于方式。您仍然有一个触发器,但触发器会将数据写入service broker队列。侦听器可以使用特殊的waitfor receive
语句来侦听队列中出现的数据。这样做的好处是,一旦触发器将数据推入代理队列,它的工作就完成了。";收据";其中的数据与最初导致其入队的事务解耦。这种服务代理机制正是像SqlDependency
这样内置在点网中的东西所使用的。
service broker的两个主要问题是复杂性和性能。Service broker有一个陡峭的学习曲线,很容易出错。如果您需要扩展,性能会变得复杂,因为在;"容易";要构建xml或json有效载荷,基于集合的大数据更改可能意味着这些有效载荷是巨大的。
无论如何,如果你想探索这条路线,你会想阅读(所有)雷穆斯·鲁萨努关于这个主题的优秀文章
请记住,这是一个异步的";接近实时";机制,而不是同步的";"实时";类似触发器的机制。
- 轮询内置的更改检测机制:CDC或更改跟踪
Sql服务器提供了两种技术;手表;在表中发生的更改,并记录它们:更改跟踪和更改数据捕获
这两个都没有将数据推出数据库,它们都是";"拉";基于。他们所做的是在发生更改时将额外的数据存储在数据库中。CDC可以提供每个变化的完整日志;指向";通过主键值更改的行。尽管这两者都涉及";轮询历史";,它们之间有显著的差异,所以请仔细阅读。
注意,CDC是";双异步"-数据是从事务日志中读取的,因此记录数据不是原始事务的一部分。然后你必须对美国疾病控制与预防中心的数据进行民意调查,它不会被推给你。此外,一旦你要求一些有用的东西,比如净变化with mask
(它可以告诉你哪些列真正改变了它们的值),当你启用CDC时,Microsoft生成的函数可能会非常慢,而且你启用CDC的能力也有很多注意和限制(再次阅读所有这些的文档)。
至于这些是"哪一个";最好";,好吧,这是意见和环境的问题。作为从SQL中获取事件的一种方式,我广泛使用了CDC,很少使用service broker,也几乎从不使用触发器。我从未在生产环境中实际使用过更改跟踪,但如果我再次选择,我可能会选择更改跟踪,而不是更改数据捕获,至少在有要求强制使用CDC之前,或者除非有要求,因为它的附加功能超出了更改跟踪所能提供的功能。
最后一点:如果你需要;担保;事实上,引发的事件已经被听众收集并成功转发给订阅者,好吧,你还有一些工作要做!保证信息传递很难。