SteamWar/BungeeCore
Archiviert
13
2

Fix deadlock #3 :/

Signed-off-by: Lixfel <agga-games@gmx.de>
Dieser Commit ist enthalten in:
Lixfel 2021-09-26 21:46:35 +02:00
Ursprung 49f7dc9911
Commit f8d6b73c0f
2 geänderte Dateien mit 37 neuen und 28 gelöschten Zeilen

Datei anzeigen

@ -20,6 +20,7 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.sql.SWException;
import de.steamwar.bungeecore.sql.Statement;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
@ -58,7 +59,7 @@ public class ErrorLogger extends Handler {
SWException.log("Bungee", "DDOS", ddosRate + "");
}
return;
} else if (stacktrace.contains("ErrorLogger")) {
} else if (!Statement.connectionStable()) {
return;
}

Datei anzeigen

@ -40,39 +40,48 @@ public class Statement {
Statement.user = user;
Statement.password = password;
try {
con = DriverManager.getConnection(url + "?autoreconnect=true", user, password);
con = DriverManager.getConnection(url + "?autoreconnect=true&useServerPrepStmts=true", user, password);
} catch (SQLException e) {
ProxyServer.getInstance().stop();
throw new SecurityException("Could not start SQL-Connection", e);
}
}
private static void reset(SQLException e) {
BungeeCore.get().getLogger().log(Level.WARNING, "SQL Exception thrown", e);
private static void reset() {
close();
connect(url, user, password);
try {
for (Statement statement : statements) {
statement.init();
}
} catch (SQLException ex) {
throw new SecurityException("Could not reprepare SQL Statements", ex);
} catch (SQLException e) {
throw new SecurityException("Could not reprepare SQL statements", e);
}
}
public static void close() {
for (Statement statement : statements) {
synchronized (statements) {
for (Statement statement : statements) {
try {
statement.st.close();
} catch (SQLException e) {
BungeeCore.get().getLogger().log(Level.INFO, "Could not close statement", e);
}
}
try {
statement.st.close();
con.close();
} catch (SQLException e) {
BungeeCore.get().getLogger().log(Level.INFO, "Could not close statement", e);
BungeeCore.get().getLogger().log(Level.INFO, "Could not close SQL connection", e);
}
}
}
public static boolean connectionStable() {
try {
con.close();
return !con.isClosed();
} catch (SQLException e) {
BungeeCore.log("Could not close SQL-Connection", e);
return false;
}
}
@ -85,39 +94,38 @@ public class Statement {
try {
init();
} catch (SQLException e) {
reset(e);
throw new SecurityException("Could not init SQL statement", e);
}
}
private synchronized void init() throws SQLException {
private void init() throws SQLException {
st = con.prepareStatement(sql);
}
<T> T select(ResultSetUser<T> user, Object... objects) {
return prepare(() -> {
ResultSet rs = st.executeQuery();
T result = user.use(rs);
rs.close();
return result;
}, objects);
synchronized (statements) {
return prepare(() -> {
ResultSet rs = st.executeQuery();
T result = user.use(rs);
rs.close();
return result;
}, objects);
}
}
void update(Object... objects) {
prepare(st::executeUpdate, objects);
synchronized (statements) {
prepare(st::executeUpdate, objects);
}
}
private synchronized <T> T prepare(SQLRunnable<T> runnable, Object... objects) {
private <T> T prepare(SQLRunnable<T> runnable, Object... objects) {
try {
setObjects(objects);
return runnable.run();
} catch (SQLException e) {
reset(e);
try {
setObjects(objects);
return runnable.run();
} catch (SQLException ex) {
throw new SecurityException("Could not execute SQL statement", ex);
}
reset();
throw new SecurityException("Could not execute SQL statement", e);
}
}