jdbc缓慢插入表(Prepared Statements)

时间:2015-02-21 19:10:55

标签: java mysql jdbc minecraft

这是我的第一个问题,所以当我提出错误时请不要惊慌失措;)

我正在运行一个Minecraft-Server Network,我使用的是spigot,它是Server软件。 它运行在具有16GB和Intel Xeon的Linux Root服务器上。

对于Spigot,您可以使用API​​编写插件代码。没问题,因为API非常简单。

我的问题: 我创建了一个Stats系统,您可以使用mysql在不同的服务器上查看您的统计信息,因此它们在每台服务器上都是相同的。 带有这个mysql插件的服务器性能不佳,我真的认为它来自MySQL。 服务器的TPS(每秒Ticks)为18-19,理想情况下应该是20才能无滞后。 我使用了准备好的陈述。

这是我的MySQL类:

package Heroz.FFA.MySQL;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MySQL {
        private String HOST = "";
        private String DATABASE = "";
        private String USER = "";
        private String PASSWORD = "";
        private String TABLE = "";
        public static Connection con;

        public MySQL(String host, String database, String user, String password,
                        String table) {
                this.TABLE = table;
                this.HOST = host;
                this.DATABASE = database;
                this.USER = user;
                this.PASSWORD = password;
                startConnection();
        }

        public void startConnection() {
                try {
                        try {
                                Class.forName("com.mysql.jdbc.Driver");
                        } catch (ClassNotFoundException e) {
                                e.printStackTrace();
                        }
                        con = DriverManager.getConnection("jdbc:mysql://" + this.HOST
                                        + ":3306/" + this.DATABASE, this.USER, this.PASSWORD);
                        System.out.println("MySQL Verbindung wurde hergestellt!");
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public void stopConnection() {
                try {
                        if (con != null) {
                                con.close();
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public void update(String name) {
                try {
                        PreparedStatement st = con.prepareStatement(name);
                        st.executeUpdate(name);
                        st.close();
                } catch (SQLException e) {
                        startConnection();
                        e.printStackTrace();
                }
        }

        public static boolean exists(String Spielername) {
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                return rs.getString("Spielername") != null;
                        }
                        return false;
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return false;
        }

        public static int getKills(String Spielername) {
                int kills = 0;
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT Kills FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                kills = rs.getInt("Kills");
                        } else {
                                kills = 0;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return kills;
        }

        public static int getTode(String Spielername) {
                int tode = 0;
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT Tode FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                tode = rs.getInt("Tode");
                        } else {
                                tode = 0;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return tode;
        }

        public static void createPlayer(String Spielername) {
                try {
                        PreparedStatement x = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "';");
                        ResultSet rs = x.executeQuery();
                        if (!rs.next()) {
                                x.executeUpdate("INSERT INTO FFA(Spielername, Kills, Tode, Wins, Punkte, Gespielt) VALUES ('"
                                                + Spielername + "', '0', '0', '0', '0', '0');");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public static void addTode(String Spielername, int karma) {
                try {
                        PreparedStatement x = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = x.executeQuery();

                        int punkte = getTode(Spielername) + karma;
                        if (rs.next()) {
                                x.executeUpdate("UPDATE FFA SET Tode = '" + punkte
                                                + "' WHERE Spielername = '" + Spielername + "'");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public static void addKills(String Spielername, int karma) {
                try {
                        PreparedStatement x = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = x.executeQuery();

                        int punkte = getKills(Spielername) + karma;
                        if (rs.next()) {
                                x.executeUpdate("UPDATE FFA SET Kills = '" + punkte
                                                + "' WHERE Spielername = '" + Spielername + "'");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public static int getWins(String Spielername) {
                int wins = 0;
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT Wins FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                wins = rs.getInt("Wins");
                        } else {
                                wins = 0;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return wins;
        }

        public static void addWins(String Spielername, int zahl) {
                try {
                        if (exists(Spielername)) {
                                PreparedStatement x = con
                                                .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                                + Spielername + "'");
                                ResultSet rs = x.executeQuery();

                                int punkte = getWins(Spielername) + zahl;
                                if (rs.next()) {
                                        x.executeUpdate("UPDATE FFA SET Wins = '" + punkte
                                                        + "' WHERE Spielername = '" + Spielername + "'");
                                }
                        } else {
                                System.out.println("§cFehler!");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public static int getPunkte(String Spielername) {
                int punkte = 0;
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT Punkte FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                punkte = rs.getInt("Punkte");
                        } else {
                                punkte = 0;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return punkte;
        }

        public static void addPunkte(String Spielername, int karma) {
                try {
                        PreparedStatement x = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = x.executeQuery();

                        int punkte = getPunkte(Spielername) + karma;
                        if (rs.next()) {
                                x.executeUpdate("UPDATE FFA SET Punkte = '" + punkte
                                                + "' WHERE Spielername = '" + Spielername + "'");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }

        public static int getPlayed(String Spielername) {
                int gespielt = 0;
                try {
                        PreparedStatement st = con
                                        .prepareStatement("SELECT Gespielt FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = st.executeQuery();
                        if (rs.next()) {
                                gespielt = rs.getInt("Gespielt");
                        } else {
                                gespielt = 0;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return gespielt;
        }

        public static void addPlayed(String Spielername, int karma) {
                try {
                        PreparedStatement x = con
                                        .prepareStatement("SELECT * FROM FFA WHERE Spielername = '"
                                                        + Spielername + "'");
                        ResultSet rs = x.executeQuery();

                        int punkte = getPlayed(Spielername) + karma;
                        if (rs.next()) {
                                x.executeUpdate("UPDATE FFA SET Gespielt = '" + punkte
                                                + "' WHERE Spielername = '" + Spielername + "'");
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }
}

如何解决这些性能问题? 玩家每隔1-10秒死亡/杀死一个人,所以它必须更新表格。

1 个答案:

答案 0 :(得分:1)

如果对内容的动态部分使用绑定变量,则仅使用PreparedStatement可以提高性能。

例如:

PreparedStatement x = con.prepareStatement("SELECT * FROM FFA WHERE Spielername = 
'"+ Spielername + "';");

应改为:

PreparedStatement x = con.prepareStatement("SELECT * FROM FFA WHERE Spielername = ?;");
x.setString(1, Spielername);

您当前使用的PreparedStatements实际上可能比直接执行语句更慢。

此外,您的更新也应使用PreparedStatements。这是另一个例子:

x.executeUpdate("UPDATE FFA SET Tode = '" + punkte
                 + "' WHERE Spielername = '" + Spielername + "'");

应改为:

PreparedStatment pStmt = conn.prepareStatement("UPDATE FFA SET Tode = ?"
    + " WHERE Spielername = ?");
pStmt.setString(1, punkte);
pStmt.setString(2, Spielername);
pStmt.executeUpdate();