当前位置: 首页 > 面试题库 >

有没有一种方法可以“监听”数据库事件并实时更新页面?

袁旻
2023-03-14
问题内容

我正在寻找一种创建简单的HTML表的方法,该表可以在数据库更改事件发生时进行实时更新。特别是添加了新记录。

换句话说,将其视为执行人员仪表板。如果进行了销售并且在数据库中添加了新行(在本例中为MySQL),则网页应使用新行“刷新”表。

我已经看到了有关新EVENT GATEWAY用法的一些信息,但是所有示例都将Coldfusion用作“推动者”,而不是“消费者”。我想让Coldfusion既将事件更新/推送到网关,又消耗响应。

如果可以结合使用AJAX和CF来完成此操作,请告诉我!

我真的只是想了解从哪里开始实时更新。

先感谢您!!

编辑/所选答案的说明:

我最后给出了@ bpeterson76的答案,因为目前最容易在小规模实现。我非常喜欢他的Datatables建议,这就是我用来实时更新的内容。

但是,随着我的站点变大(希望如此),我不确定这是否是可扩展的解决方案,因为每个用户都将访问“侦听器”页面,然后查询我的数据库。我的查询相对简单,但是我仍然担心将来的性能。

但是我认为,随着HTML5开始成为Web标准,@
iKnowKungFoo建议的Web套接字方法很可能是最好的方法。长时间轮询的彗星也是一个好主意,但是实现起来有点麻烦/似乎还存在一些缩放问题。

因此,让我们希望网络用户开始采用支持HTML5的更现代的浏览器,因为Web套接字是一种相对容易且可扩展的方式来接近实时。

如果您觉得我做错了决定,请发表评论。

最后,这是全部的一些源代码:

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>

Coldfusion:

<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>

问题答案:

这不太困难。简单的方法是通过.append添加:

$( '#table > tbody:last').append('<tr id="id"><td>stuff</td></tr>');

实时添加元素并不完全可能。您必须运行一个循环更新的Ajax查询,以“捕获”更改。因此,它不是完全实时的,而是非常接近实时的。尽管服务器的负载可能很大,但您的用户实际上不会注意到差异。

但是,如果您打算更多地参与进来,我建议您看一下DataTables。它为您提供了许多新功能,包括排序,分页,过滤,限制,搜索和Ajax加载。从那里,您可以通过ajax添加元素并刷新表格视图,也可以仅通过其API追加。我在应用程序中使用DataTables已经有一段时间了,它们一直被认为是使大量数据可用的第一功能。

-编辑-

因为不明显,所以要更新调用的DataTable,请将Datatables调用设置为变量:

var oTable = $('#selector').dataTable();

然后运行以下命令进行更新:

  oTable.fnDraw(false);

更新-5年后,2016年2月:今天比2011年更加可行。诸如Backbone.js之类的新Javascript框架可以直接连接到数据库并触发UI元素的更改,包括更改,更新或修改表。删除数据…。这是这些框架的主要优点之一。此外,可以通过与Web服务的套接字连接向UI提供实时更新,然后也可以捕获并采取措施。尽管此处描述的技术仍然有效,但是今天有更多的“实时”做事方法。



 类似资料:
  • 代码如下: 期望触发了事件页面上就更新数据

  • 问题内容: 当selectedOption的值更改时,我想调用一个函数。在SwiftUI中,有没有一种类似于编辑TextField的方法? 具体来说,我想在用户更改selectedOption时保存选择的选项。 这是我的选择器: 我仍然是SwiftUI的新手,希望获得一些帮助。谢谢! 问题答案: 如果在视图中使用@State值,则不需要多余的变量 如果需要对@State进行单独的操作,最简单的方法

  • 问题内容: 我们有一个SQL联系人数据库,可以无数次链接到我们所有的项目信息中。 最近建议我们将这些信息的联系人部分提供给最终用户的电子邮件客户端,因此我们正在考虑设置LDAP服务器。 有没有可以让我们将数据库中的信息(可能是我怀疑的视图)映射到LDAP服务器的信息? 问题答案: OpenLDAP支持使用back- sql 由元数据驱动的SQL后端。测试的状态因您选择的RDBMS后端而异。

  • 本文向大家介绍Angular2中监听数据更新的方法,包括了Angular2中监听数据更新的方法的使用技巧和注意事项,需要的朋友参考一下 angular2 模型数据更新了,需要监听数据改变, 一、实现接口Docheck,检测页面上所有元素数据更新 二、针对页面上某个元素的数据更新做处理 1、定义模板驱动表单名 2、ts 文件中新建一个表单元素对象。 3、ngonInit中订阅数据更新 以上这篇Ang

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。

  • 问题内容: 有谁知道我可以使用node.js读取文件元数据的方法吗?对于 例如,我想读的“细节” jpeg格式的选项卡上的“注释”属性 的文件(在Windows计算机上)。 问题答案: 有许多NPM包可用于读取EXIF数据。例如: