package fr.pandacube.lib.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import fr.pandacube.lib.util.Log; public class DBConnection { private static final long CONNECTION_CHECK_TIMEOUT = 30000; // in ms private Connection conn; private final String url; private final String login; private final String pass; private long timeOfLastCheck = 0; public DBConnection(String host, int port, String dbname, String l, String p) throws SQLException { url = "jdbc:mysql://" + host + ":" + port + "/" + dbname + "?autoReconnect=true" + "&useUnicode=true" + "&useSSL=false" + "&characterEncoding=utf8" + "&characterSetResults=utf8" + "&character_set_server=utf8mb4" + "&character_set_connection=utf8mb4"; login = l; pass = p; connect(); } private void checkConnection() throws SQLException { if (!isConnected()) { Log.info("Connection to the database lost. Trying to reconnect..."); close(); connect(); } } private boolean isConnected() { try { if (conn.isClosed()) return false; // avoid checking the connection everytime we want to do a db request long now = System.currentTimeMillis(); if (timeOfLastCheck + CONNECTION_CHECK_TIMEOUT > now) return true; timeOfLastCheck = now; if (conn.isValid(1)) return true; try (ResultSet rs = conn.createStatement().executeQuery("SELECT 1;")) { return rs != null && rs.next(); } } catch (Exception e) { return false; } } public Connection getNativeConnection() throws SQLException { checkConnection(); return conn; } private void connect() throws SQLException { conn = DriverManager.getConnection(url, login, pass); timeOfLastCheck = System.currentTimeMillis(); } public void close() { try { conn.close(); } catch (Exception ignored) {} } }