【发布时间】:2011-09-22 05:56:31
【问题描述】:
我正在寻找一种方法来创建一个简单的 HTML 表格,该表格可以在数据库更改事件时实时更新;特别是添加了一条新记录。
换句话说,把它想象成一个执行仪表板。如果进行了销售并且在数据库中添加了新行(在我的例子中是 MySQL),那么网页应该用新行“刷新”表格。
我已经看到了一些关于使用EVENT GATEWAY 的新信息,但所有示例都使用 Coldfusion 作为“推动者”而不是“消费者”。我想让 Coldfusion 将事件更新/推送到网关并使用响应。
如果这可以使用 AJAX 和 CF 的组合来完成,请告诉我!
我真的只是想了解从哪里开始实时更新。
提前谢谢你!!
编辑/所选答案的解释:
我最终选择了@bpeterson76 的答案,因为目前它最容易小规模实施。我真的很喜欢他的 Datatables 建议,这就是我用来接近实时更新的内容。
随着我的网站变大(希望如此),我不确定这是否是一个可扩展的解决方案,因为每个用户都会点击“监听器”页面,然后查询我的数据库。我的查询比较简单,但我还是担心以后的性能。
但在我看来,随着 HTML5 开始成为 Web 标准,@iKnowKungFoo 建议的 Web Sockets 方法很可能是最好的方法。 Comet 长轮询也是一个好主意,但实现起来有点麻烦/似乎还有一些扩展问题。
所以,让我们希望网络用户开始采用支持 HTML5 的更现代的浏览器,因为 Web Sockets 是一种接近实时的相对简单且可扩展的方式。
如果您觉得我做出了错误的决定,请发表评论。
最后,这里有一些源代码:
Javascript:
注意,这是一个非常简单的实现。它只是查看当前数据表中的记录数是否已更改,如果更改则更新表并发出警报。生产代码更长,涉及更多。这只是展示了一种接近实时更新的简单方法。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script type="text/javascript" charset="utf-8">
var originalNumberOfRecsInDatatable = 0;
var oTable;
var setChecker = setInterval(checkIfNewRecordHasBeenAdded,5000); //5 second intervals
function checkIfNewRecordHasBeenAdded() {
//json object to post to CFM page
var postData = {
numberOfRecords: originalNumberOfRecsInDatatable
};
var ajaxResponse = $.ajax({
type: "post",
url: "./tabs/checkIfNewItemIsAvailable.cfm",
contentType: "application/json",
data: JSON.stringify( postData )
})
// When the response comes back, if update is available
//then re-draw the datatable and throw an alert to the user
ajaxResponse.then(
function( apiResponse ){
var obj = jQuery.parseJSON(apiResponse);
if (obj.isUpdateAvail == "Yes")
{
oTable = $('#MY_DATATABLE_ID').dataTable();
oTable.fnDraw(false);
originalNumberOfRecsInDatatable = obj.recordcount;
alert('A new line has been added!');
}
}
);
}
</script>
冷融合:
<cfset requestBody = toString( getHttpRequestData().content ) />
<!--- Double-check to make sure it's a JSON value. --->
<cfif isJSON( requestBody )>
<cfset deserializedResult = deserializeJSON( requestBody )>
<cfset numberOFRecords = #deserializedResult.originalNumberOfRecsInDatatable#>
<cfquery name="qCount" datasource="#Application.DBdsn#" username="#Application.DBusername#" password="#Application.DBpw#">
SELECT COUNT(ID) as total
FROM myTable
</cfquery>
<cfif #qCount.total# neq #variables.originalNumberOfRecsInDatatable#>
{"isUpdateAvail": "Yes", "recordcount": <cfoutput>#qCount.total#</cfoutput>}
<cfelse>
{"isUpdateAvail": "No"}
</cfif>
</cfif>
【问题讨论】:
-
显而易见的解决方案听起来像MySQL Trigger,但可能还需要User Defined Function 才能调用Web 服务。这可能是过度杀戮。您是否有权访问进行 CREATE、UPDATE 和 DELETE 数据库调用的代码?如果是这样,您可以在该点简单地添加和额外的调用以将更改通知到其他系统。如果是这种情况,请告诉我,我也会提交答案。
-
@leggetter,是的,就是这样。基本上,我有一个更新数据库的 Web 服务,它也可以充当通知程序。我面临的问题是如何通知/响应通知?
-
好的,我已经提交了一个答案,解释了我将如何触发推送通知事件并使用实时推送解决方案。触发器可能很棘手,并不总是最简单的解决方案。
标签: mysql ajax coldfusion real-time