这是我的第一个问题,所以当我提出错误时请不要惊慌失措;)
我正在运行一个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秒死亡/杀死一个人,所以它必须更新表格。
答案 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();