MySQL监听通知等效

问题描述 投票:16回答:4

在MySQL中是否有相当于PostgresQL的notifylisten?基本上,我需要在我的Java应用程序服务器中监听触发器。

mysql events triggers notify
4个回答
2
投票

不,还没有像这样的内置功能。您需要“ping”(每1-5秒)数据库,并选择premade标志,如“read”0/1。后

SELECT * FROM mytable WHERE read = 0

用read = 1更新它


9
投票

好吧,我发现你可以在mysql中创建UDF函数,它可以做任何事情,但需要用C / C ++编写。然后可以从数据库中的更新触发器调用它们,并在更新发生时通知您的应用程序。我看到有一些安全问题。我自己并没有使用它,但从我能看到的东西看来,它可以完成你想做的事情以及更多。

http://dev.mysql.com/doc/refman/5.6/en/adding-udf.html


3
投票

我需要这样做,所以我设计了我的应用程序来发送更新通知本身。

例如。 - 场景 - 用户A正在查看记录1用户B将更新保存到记录1,而用户A将其打开。

处理:

我将自己的套接字服务器编写为Windows服务。我设计了一个类似于que的系统,基本上,

EntityType EntityID NoticeType

如果EntityType是我的数据层中需要发送通知的Poco类型,则EntityID是在sql中更改的行的主键值(poco的值),而NoticeType是1更新,2已插入,以及3已删除。

套接字服务器在安全连接上接受来自服务器端应用程序代码的连接“意味着客户端代码无法发出设计为由服务器端应用程序代码发送的请求”

套接字服务器接受类似的消息

900 1 1023 1

这意味着服务器需要通知相关客户端连接已更新ID为1023的实体类型1“人员”。

服务器知道用户需要通知什么,因为当用户查看记录时,他们在套接字服务器中注册为对记录感兴趣,并且记录的ID由客户端javascript中的Web套接字代码完成。

记录1是我的应用程序代码中的POCO,它具有IsNew和IsDirty字段。 “使用EntityFrameWork6和MySql”如果UserB的保存导致实际更改(而不仅仅是保存现有数据),则在UserB的POCO回发中IsDirty将为true。

应用程序代码看到记录是脏的,然后通过服务器端发送的套接字通知套接字服务器“将允许”,表示ID为1023的实体1已更新。

套接字服务器看到它,并将其放入que。

作为.Net,我有一个关注用户的类,它使用来自Socket Server窗口服务中运行的数据层的相同pocos。我使用linq来选择使用与实体类型相匹配的实体的用户以及que中实体的主键ID。

然后它循环遍历这些用户并向他们发送一个类似于901 1 1023 1的套接字,让他们知道实体已更新。

客户端的javascript收到它,导致用户B的页面在Record 1上进行ajax回发,但UserA的情况有所不同。

如果用户A正在进行更改,他们将弹出一个向他们显示更改的内容,以及如果他们点击保存并询问他们想要保留哪些更改,他们的新值将是什么。如果UserA没有更改,它会执行ajax回发,顶部会显示“记录更改:自动刷新”的通知栏,几秒后过期。

对此的缺点,1。它非常复杂2.它不会从应用程序外部捕获插入/更新/删除操作。

在我的情况下,2将不会发生,如果2确实发生了它由我自己或另一个知道如何手动创建通知que请求“为其构建管理页面”的开发人员。


2
投票

github项目mysql-notification提供MySQL用户定义函数MySQLNotification()作为MySQL的插件,它将通过套接字接口发送通知事件。该项目包括一个示例NodeJS测试服务器,它接收可以适用于Java或任何其他套接字服务的通知事件。

使用示例:

$ DELIMITER @@
$ CREATE TRIGGER <triggerName> AFTER INSERT ON <table> 
  FOR EACH ROW 
  BEGIN 
     SELECT MySQLNotification(NEW.id, 2) INTO @x; 
  END@@

项目包括OSX和Linux的完整源代码和安装说明。许可证是GNU v3。

© www.soinside.com 2019 - 2024. All rights reserved.