客户应用程序立即对数据库中的更新做出反应的最佳方法是什么?
题
对数据库中数据更新的直接反应进行编程的最佳方法是什么?
我可以想到的最简单的方法是一个线程,该线程检查数据库是否针对某些数据进行特定更改,并不断等待再次检查它的预定时间长度。这个解决方案似乎对我来说是浪费且优越的,所以我想知道是否有更好的方法。
我认为必须有某种方式,毕竟,像Gmail这样的Web应用程序似乎能够在发送给我的新电子邮件后几乎立即更新我的收件箱。当然,我的客户不会一直在不断检查更新。我认为他们这样做的方式是Ajax,但是Ajax如何表现得像我不知道的远程功能。我很想知道Gmail是如何做到这一点的,但是我最想知道的是如何在数据库中如何做到这一点。
编辑:请注意,我想立即对客户端代码中的更新做出反应,而不是在数据库本身中,因此据我所知,触发器无法做到这一点。基本上,我希望用户收到通知或一旦数据库中的更改进行更新。
解决方案
您基本上有两个问题:
您希望浏览器能够从Web应用程序服务器接收异步事件,而无需进行紧密循环的轮询。
您希望Web应用程序能够从数据库中接收异步事件,而不会在紧密的循环中进行轮询。
对于问题1
请参阅我认为您正在寻找的技术类型的这些Wikipedia链接:
编辑:2009年3月19日 - 刚遇到 逆转录 问题1可能很感兴趣。
对于问题2
该解决方案将是您正在使用的数据库的特定问题,也可能是您的服务器使用的数据库驱动程序。例如, Postgresql 您会使用 听 和 通知. 。 (并冒着被投票的风险,您可能会使用数据库触发器在更改表数据时调用Notify命令。)
做到这一点的另一种可能的方法是数据库 接口 创建链接到动态库(即DLL或.SO文件)的存储过程或触发器。然后,您可以在 C或其他.
在同一主题上,某些数据库允许您以语言编写存储过程,例如 Java,Ruby, Python 和 其他. 。您可能可以将其中一种用于信号机制(而不是像C这样的机器代码dll dll的内容)。
希望您能为您提供足够的想法。
其他提示
我认为必须有某种方式,毕竟,像Gmail这样的Web应用程序似乎在发送给我的新电子邮件后几乎立即更新了我的收件箱。当然,我的客户不会一直在不断检查更新。我认为他们这样做的方式是Ajax,但是Ajax如何表现得像我不知道的远程功能。我很想知道Gmail是如何做到这一点的,但是我最想知道的是如何在数据库中如何做到这一点。
有时候,与Wireshark一起窥视...看起来很定期进行一些Google流量。
根据您的数据库,触发器可能会有所帮助。我写的一个应用程序依赖于触发器,但我使用一种投票机制实际上“知道”了一些事情发生了变化。除非您可以从数据库中传达更改,否则我要说的是一些投票机制。
只是我的两分钱。
不幸的是,无法将数据推向Web浏览器 - 您只能将数据作为对请求的响应发送 - 这就是HTTP的工作方式。
不过,Ajax是您要使用的:只要您设计Web服务以确保它收到少量数据,将少量发送回去,并且可以快速运行以生成生成那个反应。