如何为频繁的数据库更新编写 Websockets/AJAX 代码?或者有没有更好的方法?

Posted

技术标签:

【中文标题】如何为频繁的数据库更新编写 Websockets/AJAX 代码?或者有没有更好的方法?【英文标题】:How to code Websockets/AJAX for frequent database updates? Or is there a better method? 【发布时间】:2015-05-02 18:25:26 【问题描述】:

我正在制作一个 htmljavascript 游戏,我目前正在尝试编写一些代码来在屏幕上显示玩家的金币余额,并在玩家每次点击 Javascript 对象(此对象放在html页面上的一个div中)。

我将在页面加载时使用 AJAX 从我的数据库中获取余额,然后将其放在 <div> 中,但我不知道如何在每次单击 Javascript 对象时使该数字减 1。

我不希望这个数字减少到 0 以下。相反,每当它达到 0 时,我想启动一个 Javascript 模式来通知玩家他们已经用完了硬币。

~~

最初我试图使用 websockets 在屏幕上显示玩家的余额,但我发现它非常混乱(我是一般编程的初学者),所以我现在尝试在页面加载时加载余额,然后每 60 秒使用 AJAX 将更新后的余额金额发布回我的数据库,或者每当用户关闭浏览器窗口、刷新页面或离开页面时。我不知道是否有可能做所有这些事情,或者从哪里开始,也许这是一个非常糟糕的方法,也许它不可扩展(也许数据库不支持来自 1000 名玩家的持续更新用这个方法)?

我非常感谢任何人在这方面给我的任何建议或帮助。

提前致谢!

【问题讨论】:

【参考方案1】:

我将在页面加载时使用 AJAX 从我的数据库中获取余额,然后将其放入 a 但我不知道如何在每次单击 Javascript 对象时使该数字减 1。

这里有两个div:你将硬币的总数存储在一个中,然后单击第二个会丢失硬币

<div id="coins">10</div>
<div onCLick="javascript:loseCoin()">If you click here it will cost you 1 coin</div>

使用函数来降低成本。

function loseCoin()
    var coins = getElementByid("coins");
    var coins_nr = parseInt(coins.innerHTML,10);
    if( coins_nr> 0 )
        coins.innerHTML = coins_nr - 1;
     else 
        showModal();
    

showModal() 将是您的模态(询问您是否知道如何制作)

至于每 60 秒更新一次数据库,您需要一个计时器循环,例如:

setInterval(function () 
      // get number of coins from your div's innerHTML
      // then call your ajax controller to update DB
, 60000);

使用 javascript 的 ajax 示例:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() 
  if (xhr.readyState == XMLHttpRequest.DONE ) 
    if(xhr.status == 200)
      console.log(xhr.responseText);
     else 
      console.log('something else other than 200 was returned');
    
  

xhr.open("POST", "url_of_your_controller_here", true);
xhr.send("coins="+ coins_nr);

(也许数据库不支持从 1000s 的持续更新 玩家使用这种方法)?

任何体面的服务器每 60 秒处理 1000 个请求应该没有问题,但这可能取决于它有多少其他请求以及您的请求的复杂性。

【讨论】:

【参考方案2】:

如果您只是想在每次点击时减少窗口中的可见计数器,您可以执行以下操作:

HTML:

<div id="coinsRemaining">20</div>

代码:

// use whatever click handler is appropriate to your app
document.addEventListener("click", function(e) 
    var elem = document.getElementById("coinsRemaining");
    // get current display text and convert to number
    var cnt = +elem.textContent;
    --cnt;
    if (cnt >= 0) 
        elem.textContent = cnt;
    
    if (cnt <= 0) 
        alert("There are no more coins");
        
);

工作演示:http://jsfiddle.net/jfriend00/s9jb6uhf/


您似乎不需要在每次点击时都更新数据库,除非您的硬币余额的某些实时方面会影响其他用户。如果您只是为将来的网页访问跟踪您的硬币余额,那么您可以比每次点击更频繁地更新数据库。

【讨论】:

以上是关于如何为频繁的数据库更新编写 Websockets/AJAX 代码?或者有没有更好的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2:如何为多个现有数据编写更新查询

如何为 Linux 应用程序生成证书?

如何为更新列的数量是动态的编写更新语句

如何为子模块更新编写 git 提交消息?

关于如何为聊天应用设计良好架构的建议?

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?