Bukkit / Spigot)更好的MySQL统计数据更新没有延迟?

时间:2017-07-07 18:17:29

标签: mysql bukkit

您好我在SQL更新播放器统计数据方面存在问题,这会导致非常大的延迟/时间下降我正在更新服务器上的统计信息停止这是我的统计代码:

<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="col-md-3 col-xs-12 widget widget_tally_box">
  <div class="x_panel fixed_height_390">
    <div class="x_content">

      <div class="flex">
        <ul class="list-inline widget_profile_box text-center">
          <li>
            <img src="images/user.png" class="img-circle profile_img">
          </li>
        </ul>
      </div>
      <h3 class="name">User Name</h3>

      <div class="flex">
        <ul class="list-inline count2">
          <li>
            <h3>123</h3>
            <span>Questions</span>
          </li>
          <li>
            <h3>1234</h3>
            <span>Answered</span>
          </li>
          <li>
            <h3>123</h3>
            <span>Unanswered</span>
          </li>
        </ul>
      </div>
      <p>
        Click here to see all the detailed information about this user.
      </p>
    </div>
  </div>
</div>

1 个答案:

答案 0 :(得分:3)

如果您正在获取命令的死亡计数或者不需要立即返回值的内容,请使用异步调度程序在单独的线程上运行代码。对于一个命令,你执行它时会做这样的事情:

Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
    try {
        int deaths = getMainSQLConnection()
                .executeQuery("SELECT * FROM `Account` WHERE playername='" + p.getName() + "'", false)
                .getInt("deaths");
        player.sendMessage("Player Deaths: " + deaths);
    } catch (SQLException ex) {
        player.sendMessage(ChatColor.RED + "That player does not exist!");
    }
});

否则,如果您因任何原因需要代码中的值,则可以使用连接池,例如HikariCP。连接池将允许您维护与数据库的多个连接,因此当您需要执行查询时,您不必每次都建立新连接(这将导致大部分延迟)。

更好的是,使用与连接池串联的异步任务。这是学习如何将HikariCP与Bukkit一起使用的好教程:https://www.spigotmc.org/threads/tutorial-implement-mysql-in-your-plugin-with-pooling.61678

作为旁注,对于服务器的性能影响基本为零,您可以在播放器登录时异步加载数据(使用AsyncPlayerPreLoginEvent)。然后在实际加入服务器(PlayerLoginEventPlayerJoinEvent)时将其存储在内存中,并在退出时将其删除。这样,您可以在他们登录而不是数据库时通过内存访问数据。这要复杂得多,而且需要大量代码才能正确实现,所以我不打算详细介绍。