答案 0 :(得分:9)
好的,我发现你可以在mysql中创建UDF函数,它可以做任何事情,但需要用C / C ++编写。然后可以从数据库中的更新触发器调用它们,并在更新发生时通知您的应用程序。我看到有一些安全问题。我自己并没有使用它,但从我能看到的东西看来,它可以完成你想要做的事情以及更多。
答案 1 :(得分:3)
我需要这样做,所以我设计了我的应用程序以发送更新通知本身。
E.g。 --Scenario-- 用户A正在查看记录1 当用户A打开记录1时,用户B保存对记录1的更新。
过程:
我将自己的套接字服务器编写为Windows服务。我设计了一个类似于que的系统,基本上是
EntityType EntityID NoticeType
如果EntityType是我的数据层中需要发送通知的Poco类型,则EntityID是在sql中更改的行的主键值(poco的值),而NoticeType是1更新,2已插入,3已删除。
套接字服务器接受来自安全连接上服务器端应用程序代码的连接“意味着客户端代码无法发出旨在由服务器端应用程序代码发送的请求”
套接字服务器接受类似
的消息900 1 1023 1
这意味着服务器需要通知相关客户端连接已更新ID为1023的实体类型1“人员”。
服务器知道用户需要通知什么,因为当用户查看记录时,他们在套接字服务器中注册为对记录感兴趣,并且记录的ID由客户端的Web套接字代码完成的JavaScript。
记录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回发,顶部会显示“记录更改:自动刷新”的通知栏,几秒后过期。
对此的缺点, 这很复杂 2.它不会从应用程序外部捕获插入/更新/删除操作。
在我的情况下,2不会发生,如果2确实发生了,我自己或其他开发人员知道如何手动创建通知请求“为此建立管理页面”。
答案 2 :(得分:2)
不,还没有像这样的内置功能。 你需要" ping" (每1-5秒)数据库选择预制标志,如"阅读" 0/1。之后
SELECT * FROM mytable WHERE read = 0
使用read = 1
更新它答案 3 :(得分:1)
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。
答案 4 :(得分:0)
您可以使用 https://maxwells-daemon.io 来执行此操作。 它基于mysql bin日志,当数据库发生变化时,它会向kafka、rabbitmq或其他流媒体平台发送带有更新的json消息