有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当存在插入Spring数据JPA时进行java数据库轮询

我有一个要求,每当表中有一个条目时,我都想触发一个事件。为此,我使用了EntityListeners(SpringDataJPA概念),它工作得非常好;但这里的问题是,插入可以通过存储过程或手动输入进行。我试着在线搜索,找到了SpringJPA入站和出站通道适配器的概念,但我认为这个概念对我想要实现的目标帮助不大。有谁能向我澄清一下,如果这个概念对我有帮助,因为我对这个概念没有太多的想法,或者就如何实现这一点向我提供任何解决方案


共 (1) 个答案

  1. # 1 楼答案

    SQL Server中没有“从数据层”引发事件的“优秀”机制

    有三个“OK”选项:

    1. 触发器(仅适用于OK)

    触发器似乎是一个显而易见的解决方案,但你必须问问自己。。。触发器实际上会做什么?如果它只是将数据写入另一个表中,那么您仍然没有脱离数据库。你可以尝试使用各种神秘的技巧,比如CLR过程,或者一些扩展过程

    但是如果你沿着这条路走下去,你必须开始考虑另一个问题:触发器发生在触发它们的DML操作的同一个事务中。如果它们需要时间来执行,则会降低OLTP工作负载。如果他们做了任何可能不可靠的事情,他们可能会失败,导致您的事务回滚

    1. 触发器加服务代理

    ServiceBroker提供了一种机制——也许是唯一一种半合理的机制——以一种基于“推”的方式将数据从SQL中取出并放入某种监听器。您仍然有一个触发器,但该触发器将数据写入ServiceBroker队列。侦听器可以使用特殊的waitfor receive语句来侦听队列中出现的数据。这样做的好处是,一旦触发器将数据推送到代理队列中,它的工作就完成了。该数据的“接收”与首先导致其排队的事务分离。这种服务代理机制是由内置在dotnet中的SqlDependency所使用的

    ServiceBroker的两个主要问题是复杂性和性能。ServiceBroker具有陡峭的学习曲线,很容易出错。如果需要扩展,性能就会变得复杂,因为尽管构建xml或json有效负载“很容易”,但基于集合的大型数据更改可能意味着这些有效负载是巨大的

    在任何情况下,如果你想探索这条路线,你会想阅读Remus Rusanu关于这一主题的(所有)优秀文章

    请记住,这是一种异步“近实时”机制,而不是像触发器那样的同步“实时”机制

    1. 轮询内置的更改检测机制:CDC或更改跟踪

    Sql server提供了两种技术,可以在本机上“监视”表中发生的更改,并记录它们:Change TrackingChange Data Capture

    这两种方法都不会将数据推出数据库,它们都是基于“拉”的。它们所做的是在发生更改时在数据库中存储额外的数据。CDC可以提供每个更改的完整日志,而更改跟踪通过主键值“指向”已更改的行。尽管这两种方法都涉及“投票历史”,但它们之间存在显著差异,因此请阅读本文

    请注意,CDC是“双异步的”——数据从事务日志中读取,因此记录数据不是原始事务的一部分。然后你必须调查CDC的数据,它不是推给你的。此外,当你要求一些有用的东西时,微软在启用CDC时生成的函数可能会慢得令人难以置信,比如净更改with mask(它可以告诉你哪些列确实改变了它们的值),而你启用CDC的能力也有很多警告和限制(同样,请阅读文档了解所有这些)

    至于哪一个是“最好的”,这是一个意见和情况的问题。我广泛使用CDC,很少使用ServiceBroker,几乎从未使用触发器,作为从SQL中获取事件的一种方式。我从未在生产环境中实际使用过更改跟踪,但如果我再次选择,我可能会选择更改跟踪而不是更改数据捕获,至少在或除非有要求强制使用CDC之前,因为CDC的附加功能超出了更改跟踪所能提供的功能

    最后一点注意:如果您需要“保证”所引发的事件实际上已被侦听器收集并成功转发给订阅者,那么,您还有一些工作要做!保证消息传递是困难的