package org.leolo.rail; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.XAConnection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mariadb.jdbc.MariaDbPoolDataSource; public class DatabaseManager { private static Logger log = LogManager.getLogger(DatabaseManager.class); private static DatabaseManager instance; private MariaDbPoolDataSource ds; public synchronized static DatabaseManager getInstance() { if(instance==null) { instance = new DatabaseManager(); } return instance; } private DatabaseManager() { ConfigurationManager cm = ConfigurationManager.getInstance(); if( !cm.containsKey("db.host")|| !cm.containsKey("db.user")|| !cm.containsKey("db.pwd")|| !cm.containsKey("db.name") ) { log.fatal("Missing required property"); System.exit(1); } String url = "jdbc:mariadb://"+cm.getProperty("db.host")+ ":"+cm.getProperty("db.port", "3306")+ "/"+cm.getProperty("db.name"); log.info("Connecting to DB {} as {}", url, cm.get("db.user")); try { ds = new MariaDbPoolDataSource(url); ds.setMinPoolSize(1); ds.setMaxPoolSize(Integer.parseInt(cm.getOrDefault("db.poolsize", "20").toString())); ds.setUser(cm.getProperty("db.user").toString()); ds.setPassword(cm.getProperty("db.pwd").toString()); } catch (SQLException e) { log.fatal("Cannot connect to DB",e); System.exit(-2); } } public boolean testPool() { try(Connection conn = ds.getConnection()){ try(Statement stmt = conn.createStatement()){ try (ResultSet rs = stmt.executeQuery("SELECT CONNECTION_ID()")){ if(rs.next()) { log.debug("Connection ID: {}", rs.getString(1)); } } } } catch (SQLException e) { log.warn("Exception when testing the connection., e"); return false; } return true; } public Connection getConnection() throws SQLException { Connection conn = ds.getConnection(); conn.setAutoCommit(false); return conn; } public XAConnection getXAConnection() throws SQLException { XAConnection conn = ds.getXAConnection(); return conn; } public void shutdown() { ds.close(); } }