2012-03-18 50 views
1

我正在构建一个移动应用程序,每10秒轮询一次打开作业($ .getJSON)的数据库。查询结果可能很重(约50kb JSON),所以我正在寻找减轻它的方法。我假设有一种方法只从数据库中检索更改,但我无法将其包裹在其中。检索自从上次查询MySQL以来的差异数据

目前,在PHP部分我只是做一个SELECT * FROM table WHERE status = 'open'。乔布斯将保持开放5分钟左右,所以在那段时间,我无用地获得了我已有的大量数据。我需要检索的只是新作业(自我上次查询后添加),可能还有那些同时关闭的作业,以便我可以将它们从列表中删除。

是否有任何实际的方法来执行此操作?也许在PHP方面?

谢谢!

+1

您可以添加“LastChangeTime”列,并只查询上次请求后已更新的作业。只是要小心从表中删除记录,因为客户永远不会看到它们已经消失。 – DCoder 2012-03-18 07:21:14

回答

0

如果不知道表格模式,有点难以判断什么是最好的。如果许多用户会进行轮询,我会建议你在客户端进行过滤。我的意思是,如果与该作业相关的轮询时间少于5分钟,请跟踪从查询中获得的每个打开的作业并将其从查询中滤除。一旦与该工作相关的投票时间超过5分钟,再次请求它。

例如,如果您查询服务器并且打开作业1,2和3,则将每个作业的时间值关联(它将相同)。

您查询服务器(10秒钟后,在这种情况下),下一次要确保你过滤掉那些不到5分钟的旧作业:

select * from table 
where status = 'open' and jobid not in (1, 2, 3) 

一旦5分钟过后,你应该删除那些来自not in条款的工作ID。

注意此解决方案将工作留给客户端,不需要任何数据库架构修改。

编辑:

有趣,但作业的开放时间平均为5分钟,一般1-8分钟之间。 - chris

算法仍然适用。你将不得不选择合适的timeout。如果您选择1分钟,则客户端将获得更多不需要的数据(但会更快地意识到状态更改)。如果您选择8分钟,那么客户将获得不需要的数据(但最多8分钟后将意识到状态更改)。您将不得不根据软件要求选择合适的超时时间。这是一个权衡,就像计算中的一切。

我的意见:这是一个移动应用程序:不要每10秒下载50kb。当餐厅现在“开放”时,应用程序是否曾经告诉我?如果是这样的话,那么延迟8分钟就没关系。但是,如果作业是核反应堆的传感器,那么1分钟的延迟可能看起来很多:)

+0

有趣,但工作的开放时间平均为5分钟,通常在1到8分钟之间。 – chris 2012-03-18 09:36:38

+0

我在回答中回答了你的评论 – 2012-03-18 14:56:38