Merge branch 'master' into dbschemacheck

This commit is contained in:
Lukas-Heiligenbrunner
2020-04-17 18:32:23 +02:00
committed by GitHub
2 changed files with 54 additions and 23 deletions

View File

@@ -1,6 +1,8 @@
package com.wasteinformationserver.db;
import com.mysql.cj.exceptions.ConnectionIsClosedException;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.basicutils.Storage;
import java.io.IOException;
import java.sql.*;
@@ -10,6 +12,7 @@ import java.util.Scanner;
* basic connection class to a Database
*
* @author Lukas Heiligenbrunner
* @author Emil Meindl
*/
public class JDBC {
private static Connection conn;
@@ -23,7 +26,7 @@ public class JDBC {
private static String ipc;
private static int portc;
private JDBC(String username, String password, String dbname, String ip, int port) throws IOException {
private JDBC(String username, String password, String dbname, String ip, int port) {
logintodb(username, password, dbname, ip, port);
}
@@ -67,11 +70,7 @@ public class JDBC {
*/
public static JDBC getInstance() {
if (!loggedin) {
try {
JDBC = new JDBC(usernamec, passwordc, dbnamec, ipc, portc);
} catch (IOException e) {
Log.Log.error("no connetion to db - retrying in 5min");
}
logintodb(usernamec, passwordc, dbnamec, ipc, portc);
}
return JDBC;
}
@@ -86,7 +85,7 @@ public class JDBC {
* @param port Server port
* @throws IOException thrown if no connection to db is possible.
*/
private void logintodb(String username, String password, String dbname, String ip, int port) throws IOException {
private static boolean logintodb(String username, String password, String dbname, String ip, int port) {
try {
DriverManager.setLoginTimeout(1);
conn = DriverManager.getConnection(
@@ -95,10 +94,32 @@ public class JDBC {
password);
checkDBStructure();
loggedin = true;
Log.Log.message("Connected to database");
} catch (SQLException e) {
throw new IOException("No connection to database");
// todo reconnect every 5mins or something
// reconnect every 10 sec
Log.Log.warning("Database-Connection not possible");
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
Log.Log.debug("Reading config");
Storage st = Storage.Companion.getInstance();
st.init();
usernamec = st.getDbName();
passwordc = st.getDbPassword();
dbnamec = st.getDbName();
ipc = st.getDbhost();
portc = st.getDbPort();
Log.Log.info("Retry connection");
loggedin = logintodb(usernamec, passwordc, dbnamec, ipc, portc);
}
}).start();
}
return loggedin;
}
public void disconnect() {
@@ -117,12 +138,19 @@ public class JDBC {
*/
public ResultSet executeQuery(String sql) {
try {
conn.isValid(5);
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeQuery();
} catch (SQLNonTransientConnectionException ee){
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
return this.executeQuery(sql);
} else {
return null;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return null;
}
/**
@@ -133,9 +161,19 @@ public class JDBC {
* @throws SQLException
*/
public int executeUpdate(String sql) throws SQLException {
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeUpdate();
try {
conn.isValid(5);
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeUpdate();
} catch (SQLNonTransientConnectionException ee){
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
return this.executeUpdate(sql);
} else {
throw new SQLException();
}
} catch (SQLException e){
throw new SQLException();
}
}
/**