Привет, пользователи Stackoverflow,SQL ResultSet закрытие suddently
У меня возникла проблема с моим SQL-соединением на данный момент. Прежде всего, вот как обрабатывается разъем
package com.rs.utils.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.rs.utils.Logger;
public class DatabaseManager {
private String host;
private String database;
private String username;
private String password;
private Connection connection;
private PreparedStatement statement;
private boolean connected;
public DatabaseManager() {
this.host = "";// Settings.DB_HOST;
this.database = "";// Settings.DB_NAME;
this.username = "";// Settings.DB_USER;
this.password = "";// Settings.DB_PASS;
this.connected = false;
}
public void connect() {
try {
connection = DriverManager.getConnection("jdbc:mysql://" + host
+ "/" + database
+ "?jdbcCompliantTruncation=false&autoReconnect=true",
username, password);
Logger.info("Successfully connected with " + host + "/" + database);
connected = true;
} catch (Exception e) {
Logger.info("Unable to connect with " + host + "/" + database + ".");
connected = false;
}
}
public ResultSet executeQuery(String query) {
try {
if (!connected())
return null;
statement = connection.prepareStatement(query);
ResultSet results = statement.executeQuery();
return results;
} catch (Exception e) {
Logger.handle(e);
}
return null;
}
public int executeUpdate(String query) {
try {
if (!connected())
return 0;
statement = connection.prepareStatement(query);
return statement.executeUpdate();
} catch (Exception e) {
Logger.handle(e);
}
return 0;
}
public boolean connected() {
return connected;
}
public PreparedStatement statement() {
return statement;
}
}
Много запросов отправляется в базу данных, используя экземпляр DatabaseManager, например:
databaseManager.executeUpdate(query);
databaseManager определяется как :
private static DatabaseManager databaseManager = new DatabaseManager();
Я получаю следующее Throwable:
java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:803)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1126)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5732)
at com.rs.utils.sql.PlayerSaving.load(PlayerSaving.java:362)
at com.rs.utils.sql.PlayerLoader.load(PlayerLoader.java:90)
метод загрузки в PlayerLoader:
public static boolean load(Player player, boolean lobby) {
ResultSet result = null;
try {
final long current = System.currentTimeMillis();
result = World.database().executeQuery("SELECT " + (lobby ? "displayName, rights" : "*") + " FROM " + PLAYER_TABLE + " WHERE username='" + player.getPlayerDefinition().username() + "' LIMIT 1");
if (!result.next()) {
return false;
}
if (lobby) {
player.getPlayerDefinition().setRights(result.getInt("rights")).setDisplayName(result.getString("displayName"));
} else {
**player.playerSaving().load(result);**
}
Logger.log("Loader", "Player loaded in " + (System.currentTimeMillis() - current) + "ms.");
return true;
} catch (Exception e) {
Logger.log("Loader", "Unable to load player profile.");
Logger.handle(e);
System.err.println("Error Loading the account.");
} finally {
try {
if (result != null) {
result.close();
}
result = null;
World.database().statement().close();
} catch (SQLException e) {
Logger.handle(e);
}
}
return false;
}
метод PlayerSaving нагрузки просто назначить другого экземпляра класса значения из базы данных с result.getInt ("rowName"), и т.д., как получено на ResultSet , это более 250 строк.
ResultSet прекрасно работает большую часть времени, это очень редкое событие, например, 1 из 100 попыток входа в систему. Но почему-то ResultSet закрывается посередине назначений переменных, например, он назначает 100 из 200 переменных, затем ResultSet закрывается с трудом и генерирует исключение.
Любые идеи?
Ошибка самообслуживания «Операция не разрешена после закрытия ResultSet», поэтому вы читаете значение, пока оно уже закрыто. @Tom Lima – HaveNoDisplayName
Да, но он закрывается, я не прошу его закрыть, как вы можете видеть, мой код считывает все значения, присваивает значения из базы данных новому экземпляру класса (ints, string, longs и т. д.), затем в финале Блокировка закрывает ResultSet. –
Pls обеспечивает реализацию метода player.playerSaving(). Load (result). – flo