MySQL MySQL Connection reset

yakazuqi

Mitglied
Guten Abend allerseits.
Ich habe zurzeit ein ziemlich nerviges Problem. Und zwar kommt nach circa 8 Stunden ein Fehler, wenn man zum Beispiel Werte setzt oder abfragt. Man kann wahrscheinlich die Dauer der vorhandenen Verbindung erhöhen. Aber selbst dann wird sie irgendwann schließen.

[CODE lang="java" title="MySQL Class"]@Getter
private Connection connection;

public void connect() {
try {
connection = DriverManager.getConnection("jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE, USERNAME, PASSWORD);
} catch (Exception e) {
Main.log("§cThe connection to the database failed: " + e.getMessage());
}
}

public void createTable() {
connect();
update("CREATE TABLE IF NOT EXISTS SpeedCW (UUID CHAR(36), USERNAME VARCHAR(16), KILLS INT(10), DEATHS INT(10), PLAYED INT(10), WINS INT(10), BED INT(10), LOSES INT(10), WONGAMEWITHDESTORYBED INT(10), PRIMARY KEY(UUID))");
update("CREATE TABLE IF NOT EXISTS Achievements (UUID CHAR(36), USERNAME VARCHAR(16), FIRSTTIME INT(1), BUSINESSMAN INT(1), ELITE INT(1), FAIRPLAY INT(1), FIRSTBLOOD INT(1), OVERPOWERING INT(1), WINNER INT(1), SAGITTARIUS INT(1), BEAM INT(1), BOWKILL INT(1), CLUMSY INT(1), PRIMARY KEY(UUID))");
}

public void disconnect() {
if(isConnected()) {
try {
connection.close();
} catch (Exception e) {
}
}
}

private boolean isConnected() {
return connection != null;
}

public void update(String query) {
if(connection != null) {
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.executeUpdate();
preparedStatement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}[/CODE]

[CODE lang="java" title="Mit dieser Methode hol ich mir die Werte"]public Integer getKills(OfflinePlayer player) {
try {
PreparedStatement preparedStatement = Main.getInstance().getMySQL().getConnection().prepareStatement("SELECT * FROM SpeedCW WHERE UUID = ?");
preparedStatement.setString(1, player.getUniqueId().toString());
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
return resultSet.getInt("KILLS");
}
resultSet.close();
preparedStatement.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return 0;
}[/CODE]

Mit freundlichen Grüßen
 
K

kneitzel

Gast
Also meine Meinung ist hier relativ deutlich, aber halt von meiner .Net Entwicklung her geprägt:

Connection Pools! Das ist da der Standard und wird eigentlich immer genutzt. Apache Commons DBCP wäre bei java dann zu nennen als eine Lösung:

Der Ablauf ist dann immer gleich:
- DriverManger wird um eine Connection gebeten.
- Die Connection wird genutzt
- Am Ende wird die Connection geschlossen.

Und natürlich kommt auch eine Begründung - dazu schauen wir uns einfach die genannten anderen Lösungen an:

a) "PING"-Lösung. Sorry, aber das ist hoffentlich nicht ernst gemeint. Die Connection kann ja auch aus anderen Gründen geschlossen worden sein.
b) autoReconnect ist gut. Das macht dann das, was man auch manuell machen kann: Prüfen, ob die Connection da ist um diese dann ggf. zu erneuern. Wenn man dies manuell machen würde, wäre der erste Schritt, dass man das isConnected verbessert: isValid(int) müsste da als Aufruf mit dazu genommen werden ...

Das sieht nach einer brauchbaren Lösung aus, ABER:
Sobald es zu mehreren Threads kommt, hat man ein Problem. JDBC Treiber sollten zwar thread safe aufgebaut sein, aber das bedeutet nicht, dass da über eine Connection mehrere Befehle gleichzeitig abgesetzt werden. Es blockiert dann einfach nur ein Thread, bis der andere fertig ist. Also nicht gut.

Daher: Das Problem kann man lösen, indem man Connections vor dem Befehl erst holt und nach der Nutzung direkt freigibt. Und um die ständigen Verbindungsaufbauten nicht zu haben (Wenn man nur hin und wieder mal eine Connection braucht, wäre das ggf. sogar schon eine Lösung ohne Connection Pool!) nutzt man einen Connection Pool.

Edit: fehlendes t eingefügt - Tastatur mag nicht mehr ...
 

mihe7

Top Contributor
a) "PING"-Lösung. Sorry, aber das ist hoffentlich nicht ernst gemeint. Die Connection kann ja auch aus anderen Gründen geschlossen worden sein.
Der Ping-Request ist gerade dazu da, die Connection zu validieren (s. Link oben). Das macht ein Connection Pool nicht anders, oder andersrum gesagt: auch beim Connection Pool zieht MySQL einer offene Connection irgendwann den Boden unter den Füßen weg. Gerade dbcp2 löst dieses Problem m. W. nicht, c3p0 hat dagegen einen Validator. Eine Alternative wäre, immer eine frische Connection zu verwenden. Dann braucht man sich aber über Connection Pooling erst recht keine Gedanken mehr zu machen. Statt regelmäßigen Pings kann die Validierung natürlich auch im Rahmen des Exception-Handlings erfolgen, um festzustellen, ob eine neue Verbindung aufgebaut werden muss.

Was autoReconnect betrifft: "The use of this feature is not recommended, because it has side effects related to session state and data consistency when applications don't handle SQLExceptions properly, and is only designed to be used when you are unable to configure your application to handle SQLExceptions resulting from dead and stale connections properly." (https://dev.mysql.com/doc/connector...nd-clustering.html#cj-conn-prop_autoReconnect)
 
K

kneitzel

Gast
Ja, es wist wohl wieder nur eine Wortwahl, die etwas aufgefallen ist, denn es braucht doch etwas mehr als eben nur das "Mach von Zeit zu Zeit einen Ping-Request". Das klang halt mehr nach "schick einfach nur hin und wieder so einen Request, damit die Verbindung nicht geschlossen wird.

Da geht es ja darum, eine Verbindung zu validieren, ehe sie benutzt wird.

Also statt:
Java:
@Getter
private Connection connection;

eher etwas wie (Vereinfacht gezeigt):
Java:
private Connection connection;

public Connection getConnection() {
    if (!isValid()) {
        connect();
        if (!isValid()) throw new DatabaseNotAvailableException();
    }
    return connection;
}

Also den Sinn eines PING Requests zur Validierung bestreite ich nicht. Aber der alleine bringt nicht viel. Der mag ein Timeout verhindern aber es ändert nichts an der generellen Thematik.

auch beim Connection Pool zieht MySQL einer offene Connection irgendwann den Boden unter den Füßen weg. Gerade dbcp2 löst dieses Problem m. W. nicht
Öhm - meine Erwartung beim ConnectionPool ist gerade, dass immer eine Connection geliefert wird, die valide ist, d.h. dass der ConnectionPool den Status entsprechend prüft. Oder meinst Du, dass eine Connection, die man von einem ConnectionPool bekommt, auch einen Timeout haben kann?
Ich muss gestehen, dass ich mich bei Java in erster Linie auf die vorhandenen Libraries stütze und so Themen anderen Libraries überlasse. Aber da interessiert mich nun wirklich: Kann es sein, dass mir dbcp2 eine Connection gibt, die nicht valide ist? Sprich ich habe dann Code wie
Java:
DataSource dataSource = setupDataSource(.....);
Connection conn = dataSource.getConnection();
// kann conn hier nicht valide sein?

Die Dokumentation besagt hier nichts - es wird eine Connection zurück gegeben ... Aber meine Erwartungshaltung wäre, dass entweder eine freie Connection aus dem Pool geprüft wird (isValide(...) ist damit true!) oder wenn es so eine Connection nicht gibt, dass dann eine neue Connection erstellt wird.
 

mihe7

Top Contributor
Das Problem hatten wir vor x Jahren mit einem Connection Pool schon gehabt. Wobei Du mir gerade die Betriebsblindheit genommen hast:
meine Erwartung beim ConnectionPool ist gerade, dass immer eine Connection geliefert wird, die valide ist, d.h. dass der ConnectionPool den Status entsprechend prüft.
Und auch der Ping-Request sollte vom Treiber bei isValid() abgesetzt werden. Au, das ist ja peinlich. Ich nehme alles zurück und behaupte das Gegenteil :)

Danke, für diesen erleuchtenden Moment.
 

yakazuqi

Mitglied
b) autoReconnect ist gut. Das macht dann das, was man auch manuell machen kann: Prüfen, ob die Connection da ist um diese dann ggf. zu erneuern.
Meines Wissens nach ist autoReconnect veraltet und wird kaum noch genutzt.

Wie wäre es damit?
[CODE lang="java" title="isConnected"]private boolean isConnected() {
try {
return (connection != null && connection.isValid(5));
} catch (SQLException exception) {
exception.printStackTrace();
}
}[/CODE]
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Meine bevorzugte Lösung ist und bleibt der Connection Pool. Dein Code könnte aber eine Basis darstellen. Du braucht natürlich einen Code bei getConnection, der das checkt und dann ggf. eine neue Connection erstellt.

Edit: musst natürlich den Code noch so anpassen, dass er compilert (return false im catch z.B.)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
P MySQL Connection Global Datenbankprogrammierung 13
W MySQL-Connection-Objekt übergeben Datenbankprogrammierung 2
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
S Java Connection to MySQL Datenbank FunPic Datenbankprogrammierung 4
H DB-Connection zu MySQL Datenbankprogrammierung 12
G MySQL Connection Problem Datenbankprogrammierung 3
R sql.Connection vs. mysql.Connection Datenbankprogrammierung 3
F Connection refused: connect Bei Verbindungsherstellung zu MySQL Datenbank Datenbankprogrammierung 3
F MySQL - Connection JDBC-Driver Problem Datenbankprogrammierung 4
D Probleme mit mysql-Connection Datenbankprogrammierung 10
K "Connection timed out: connect" bei MySQL-Verbindu Datenbankprogrammierung 10
J Keine Connection zur MySQL Db Datenbankprogrammierung 6
T problem mit mysql connection Datenbankprogrammierung 6
M [MYSQL] Problem mit Connection und Abfrage Datenbankprogrammierung 6
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
M MySQL Datenbank in Array Datenbankprogrammierung 2
P MySQL- Neues Passwort Datenbankprogrammierung 1
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
sserio SQL oder MySQL Datenbankprogrammierung 44
OnDemand Mysql Query Builder Datenbankprogrammierung 1
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
OnDemand MySql Foreign Key nötig oder unnötig Datenbankprogrammierung 3
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
OnDemand MySQL und mongoDB wann macht was Sinn? Datenbankprogrammierung 11
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
D MYSQL goorm IDE - Wie speichern? Datenbankprogrammierung 0
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
J MySQL - Primary Key Date,Time vs ID Datenbankprogrammierung 16
ruutaiokwu MySQL: Messwerte, welche stagnieren interpolieren? Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
J MySQL MySQL Risiken bei Stromausfall minimieren Datenbankprogrammierung 9
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
D MySQL Zeilen kumulieren Datenbankprogrammierung 8
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
K Servlet-MySQL DB Datenbankprogrammierung 2
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
D Datumsformat aus MySQL ändern Datenbankprogrammierung 15
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K MySQL LAN-MySQL Server mit XAMPP Datenbankprogrammierung 2
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
X MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern? Datenbankprogrammierung 9
K Anfängerfrage CSV in MySQL Datenbankprogrammierung 41
I MySQL Wert nachträglich bearbeiten Datenbankprogrammierung 1
N MySQL Datenbank lokal Datenbankprogrammierung 3
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
B MySQL installieren - silent / User anlegen Datenbankprogrammierung 3
X MySQL Verbindungdsaufbau MySql auf Ubuntu-Server Datenbankprogrammierung 10
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
M MySQL MySQL DATETIME-Import Datenbankprogrammierung 9
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
D MySQL Grundsätzliche Fragen zu MySQL Datenbankprogrammierung 3
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
M MySQL-Syntax-Fehler Datenbankprogrammierung 1
M In MySql Datenbank schreiben Datenbankprogrammierung 6
D mySQL Timestamp in RegularTimePeriod bzw Second Datenbankprogrammierung 3
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
windl MySQL und HSQLDB Datenbankprogrammierung 4
S Anbindung zur mysql von mit Swing und AWT Datenbankprogrammierung 22
F MySQL+ Netbeans: Datenbanken mit Automatisch generierten Entity Classes get und set Datenbankprogrammierung 2
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
F BPlaced MySql Datenbank ansprechen Datenbankprogrammierung 5
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
M MySQL Datenbank durchsuchen Datenbankprogrammierung 5
Z MySQL mysql Facharbeit: Tipps und Ideen gesucht Datenbankprogrammierung 5
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
Z MySQL Shopsystem mit mysql und Java Datenbankprogrammierung 8
S [MySQL] Topliste Datenbankprogrammierung 2
H Datenbank-Anbindung Java/MySQL Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
J Dateien in MySQL speichern & indizieren Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben