diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..94c0cbd --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +logging/ +compiled-builds/ +*.iml +.idea/ +target/** +TODO.txt +packet.pkt +plugins/** +src/test/ +target/ +config.ini +*.txt +*.jar +*.log +*.zip +.DS_Store + diff --git a/Emulator/pom.xml b/Emulator/pom.xml index cf63987..850f932 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -69,7 +69,9 @@ maven-javadoc-plugin 3.2.0 - -Xdoclint:none + + -Xdoclint:none + public @@ -104,9 +106,9 @@ - mysql - mysql-connector-java - 8.0.22 + com.mysql + mysql-connector-j + 8.3.0 runtime diff --git a/Emulator/src/main/java/com/eu/habbo/database/DatabasePool.java b/Emulator/src/main/java/com/eu/habbo/database/DatabasePool.java index 9a33ba2..a2e8bac 100644 --- a/Emulator/src/main/java/com/eu/habbo/database/DatabasePool.java +++ b/Emulator/src/main/java/com/eu/habbo/database/DatabasePool.java @@ -8,44 +8,55 @@ import org.slf4j.LoggerFactory; class DatabasePool { private final Logger log = LoggerFactory.getLogger(DatabasePool.class); + private static final String DB_POOL_MAX_SIZE = "db.pool.maxsize"; + private static final String DB_POOL_MIN_SIZE = "db.pool.minsize"; + private static final String DB_HOSTNAME_KEY = "db.hostname"; + private static final String DB_PORT_KEY = "db.port"; + private static final String DB_PASSWORD_KEY = "db.password"; + private static final String DB_NAME_KEY = "db.database"; + private static final String DB_USER_KEY = "db.username"; + private static final String DB_PARAMS_KEY = "db.params"; private HikariDataSource database; + private static DatabasePool instance; + + DatabasePool() { + // Private constructor for singleton pattern + } + + public static synchronized DatabasePool getInstance() { + if (instance == null) { + instance = new DatabasePool(); + } + return instance; + } public boolean getStoragePooling(ConfigurationManager config) { try { HikariConfig databaseConfiguration = new HikariConfig(); - databaseConfiguration.setMaximumPoolSize(config.getInt("db.pool.maxsize", 50)); - databaseConfiguration.setMinimumIdle(config.getInt("db.pool.minsize", 10)); - databaseConfiguration.setJdbcUrl("jdbc:mysql://" + config.getValue("db.hostname", "localhost") + ":" + config.getValue("db.port", "3306") + "/" + config.getValue("db.database", "habbo") + config.getValue("db.params")); - databaseConfiguration.addDataSourceProperty("serverName", config.getValue("db.hostname", "localhost")); - databaseConfiguration.addDataSourceProperty("port", config.getValue("db.port", "3306")); - databaseConfiguration.addDataSourceProperty("databaseName", config.getValue("db.database", "habbo")); - databaseConfiguration.addDataSourceProperty("user", config.getValue("db.username")); - databaseConfiguration.addDataSourceProperty("password", config.getValue("db.password")); - databaseConfiguration.addDataSourceProperty("dataSource.logger", "com.mysql.jdbc.log.StandardLogger"); - databaseConfiguration.addDataSourceProperty("dataSource.logSlowQueries", "true"); - databaseConfiguration.addDataSourceProperty("dataSource.dumpQueriesOnException", "true"); - databaseConfiguration.addDataSourceProperty("prepStmtCacheSize", "500"); - databaseConfiguration.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - // databaseConfiguration.addDataSourceProperty("dataSource.logWriter", Logging.getErrorsSQLWriter()); - databaseConfiguration.addDataSourceProperty("cachePrepStmts", "true"); - databaseConfiguration.addDataSourceProperty("useServerPrepStmts", "true"); - databaseConfiguration.addDataSourceProperty("rewriteBatchedStatements", "true"); - databaseConfiguration.addDataSourceProperty("useUnicode", "true"); - databaseConfiguration.setAutoCommit(true); - databaseConfiguration.setConnectionTimeout(300000L); - databaseConfiguration.setValidationTimeout(5000L); - databaseConfiguration.setLeakDetectionThreshold(20000L); - databaseConfiguration.setMaxLifetime(1800000L); - databaseConfiguration.setIdleTimeout(600000L); - //databaseConfiguration.setDriverClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource"); + databaseConfiguration.setMaximumPoolSize(config.getInt(DB_POOL_MAX_SIZE, 50)); + databaseConfiguration.setMinimumIdle(config.getInt(DB_POOL_MIN_SIZE, 10)); + databaseConfiguration.setJdbcUrl("jdbc:mysql://" + config.getValue(DB_HOSTNAME_KEY, "localhost") + ":" + config.getValue(DB_PORT_KEY, "3306") + "/" + config.getValue(DB_NAME_KEY) + config.getValue(DB_PARAMS_KEY)); + databaseConfiguration.addDataSourceProperty("serverName", config.getValue(DB_HOSTNAME_KEY, "localhost")); + databaseConfiguration.addDataSourceProperty("port", config.getValue(DB_PORT_KEY, "3306")); + databaseConfiguration.addDataSourceProperty("databaseName", config.getValue(DB_NAME_KEY)); + databaseConfiguration.addDataSourceProperty("user", config.getValue(DB_USER_KEY)); + databaseConfiguration.addDataSourceProperty("password", config.getValue(DB_PASSWORD_KEY)); + log.info("INITIALIZING DATABASE SERVER: " + config.getValue(DB_HOSTNAME_KEY)); + log.info("ON PORT: " + config.getValue(DB_PORT_KEY)); + log.info("HABBO DATABASE: " + config.getValue(DB_NAME_KEY)); + this.database = new HikariDataSource(databaseConfiguration); } catch (Exception e) { + log.error("Error initializing database connection pool: {}", e.getMessage()); return false; } return true; } public HikariDataSource getDatabase() { - return this.database; + if (database == null) { + throw new IllegalStateException("Database connection pool is not initialized."); + } + return database; } } \ No newline at end of file