您好我在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>
答案 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
)。然后在实际加入服务器(PlayerLoginEvent
或PlayerJoinEvent
)时将其存储在内存中,并在退出时将其删除。这样,您可以在他们登录而不是数据库时通过内存访问数据。这要复杂得多,而且需要大量代码才能正确实现,所以我不打算详细介绍。