java - 为什么我的 Minecraft bukkit 插件出现 mysql 延迟?

标签 java mysql minecraft bukkit

我制作了一个带有 mysql 的 bukkit 插件,我需要知道为什么每当此代码运行时我都会出现延迟,我在我的系统上运行服务器,并且带有 hostgator 的 mysql 服务器是我的代码

    openConnection();
                try{
                    int level1 = 0;

                    if(playerDataConatinsPlayer(p)){
                        PreparedStatement sql = connection.prepareStatement("SELECT level FROM `player_data` WHERE player=?;");
                        sql.setString(1, p.getName());

                        ResultSet result = sql.executeQuery();

                        result.next();

                        level1 = result.getInt("level");

                        PreparedStatement levelUpdate = connection.prepareStatement("UPDATE `player_data` SET level=? WHERE player=?;");

                        levelUpdate.setInt(1, level1+1);
                        levelUpdate.setString(2, p.getName());
                        levelUpdate.executeUpdate();

                        levelUpdate.close();
                        sql.close();
                        result.close();
                    }else{
                        PreparedStatement newPlayer = connection.prepareStatement("INSERT INTO `player_data` values(?,0,1,0);");
                        newPlayer.setString(1, p.getName());

                        newPlayer.execute();
                        newPlayer.close();
                    }

                }catch(Exception e1){
                    e1.printStackTrace();
                }finally{
                    closeConnection();
                }

这是我的 openconnection 方法

    public synchronized static void openConnection(){
    try{
        connection = DriverManager.getConnection(""); //i know its empty cause i dont wanna give that info out
    }catch(Exception e){
        e.printStackTrace();
    }
}

这是我的紧密连接

public synchronized static void closeConnection(){
    try{
        connection.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

最佳答案

您可以采取一些措施来加快查询延迟:

  • 如果您的应用是查询密集型应用,请使用持久连接并使其保持打开状态,而不是每次需要访问数据库时都打开新连接。

  • 在本地运行 MySQL 服务器以加快连接时间。

  • 对表的搜索字段(例如 player_data 上的 player)建立索引,以使搜索运行得更快。

  • 在配备 SSD 驱动器和大量 RAM 的功能强大的专用计算机上运行 MySQL 服务器,并在 my.cnf 上设置适当的参数(工作线程、最大进程数、最大进程数)连接数、内存限制、缓冲区大小),以利用 RAM 和处理能力并加快搜索和处理时间。像this question and answers之类的东西可能会帮助您进行内存设置,但您能做的最好的事情就是您自己进行详尽的在线研究和测试。做好功课!

  • 使用某种缓存系统来加快读取速度(例如 memcached)。

  • 如果您的应用是数据密集型的并且必须支持大量连接,请获取更高的带宽,甚至考虑设置集群来平衡负载。

  • 减少查询次数!不需要两次查询数据库来提升级别!

尝试:

if (playerDataContainsPlayer(p)){

    PreparedStatement levelUpdate = connection.prepareStatement(
        "UPDATE player_data SET level=level+1 WHERE player=?;"
    );
    levelUpdate.setString(1, p.getName());
    levelUpdate.executeUpdate();
    levelUpdate.close();
    sql.close();

} else {
    ...
}

关于java - 为什么我的 Minecraft bukkit 插件出现 mysql 延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24274809/

相关文章:

java - 正则表达式在找到单词后停止处理

java - 从对象中获取值并添加到 jcombobox 中

java - Vim 插件仅在文件作为 arg 提供以启动命令时才有效

php - 对于大型 sql 数据库,我如何找到哪个表已更新或受网站操作影响

java - 存储多人 PvP 数据的有效方法?

python - 替换 .yml 文件中的一行的程序(PYTHON)

java - 从 HttpServletRequest 获取损坏的 cookie 值

mysql - tinyint 还是 varchar(1)?

html - 包含html数据的mysql表中的REGEX

java - Minecraft 模组 - 如何在服务器端使用 setBlock?