From 1aa0887fa9c91db23f3ba2e097c5b480a564afd4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Nov 2025 19:30:42 +0000 Subject: [PATCH] Implement database connection initialization - Created DatabaseManager class in config package to manage database connections - Implemented singleton pattern with JPA EntityManagerFactory and HikariCP connection pooling - Initialized database connection in MediaManagerApplication on startup - Added proper shutdown cleanup for database resources in shutdown hook - Uncommented Media entity class in persistence.xml to enable JPA mapping - Resolved TODO: Initialize database connection (MediaManagerApplication.java:21) --- .../mediamanager/MediaManagerApplication.java | 14 +++- .../mediamanager/config/DatabaseManager.java | 71 +++++++++++++++++++ src/main/resources/META-INF/persistence.xml | 2 +- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/mediamanager/config/DatabaseManager.java diff --git a/src/main/java/com/mediamanager/MediaManagerApplication.java b/src/main/java/com/mediamanager/MediaManagerApplication.java index d3030da..25b59e9 100644 --- a/src/main/java/com/mediamanager/MediaManagerApplication.java +++ b/src/main/java/com/mediamanager/MediaManagerApplication.java @@ -1,5 +1,6 @@ package com.mediamanager; +import com.mediamanager.config.DatabaseManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -10,6 +11,7 @@ import java.util.Properties; public class MediaManagerApplication { private static final Logger logger = LogManager.getLogger(MediaManagerApplication.class); private static Properties config; + private static DatabaseManager databaseManager; public static void main(String[] args) { logger.info("Starting MediaManager Core Application..."); @@ -18,7 +20,9 @@ public class MediaManagerApplication { // Load configuration loadConfiguration(); - // TODO: Initialize database connection + // Initialize database connection + databaseManager = DatabaseManager.getInstance(config); + // TODO: Initialize IPC server with named pipes // TODO: Start application services @@ -28,7 +32,9 @@ public class MediaManagerApplication { // Keep application running Runtime.getRuntime().addShutdownHook(new Thread(() -> { logger.info("Shutting down MediaManager Core..."); - // TODO: Cleanup resources + if (databaseManager != null) { + databaseManager.shutdown(); + } })); } catch (Exception e) { @@ -52,4 +58,8 @@ public class MediaManagerApplication { public static Properties getConfig() { return config; } + + public static DatabaseManager getDatabaseManager() { + return databaseManager; + } } diff --git a/src/main/java/com/mediamanager/config/DatabaseManager.java b/src/main/java/com/mediamanager/config/DatabaseManager.java new file mode 100644 index 0000000..57efa94 --- /dev/null +++ b/src/main/java/com/mediamanager/config/DatabaseManager.java @@ -0,0 +1,71 @@ +package com.mediamanager.config; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class DatabaseManager { + private static final Logger logger = LogManager.getLogger(DatabaseManager.class); + private static DatabaseManager instance; + private EntityManagerFactory entityManagerFactory; + + private DatabaseManager(Properties config) { + initializeEntityManagerFactory(config); + } + + public static synchronized DatabaseManager getInstance(Properties config) { + if (instance == null) { + instance = new DatabaseManager(config); + } + return instance; + } + + private void initializeEntityManagerFactory(Properties config) { + try { + logger.info("Initializing database connection..."); + + Map properties = new HashMap<>(); + properties.put("jakarta.persistence.jdbc.url", config.getProperty("db.url")); + properties.put("jakarta.persistence.jdbc.user", config.getProperty("db.username")); + properties.put("jakarta.persistence.jdbc.password", config.getProperty("db.password")); + properties.put("jakarta.persistence.jdbc.driver", config.getProperty("db.driver")); + + properties.put("hibernate.hikari.maximumPoolSize", config.getProperty("db.pool.maximum-pool-size")); + properties.put("hibernate.hikari.minimumIdle", config.getProperty("db.pool.minimum-idle")); + properties.put("hibernate.hikari.connectionTimeout", config.getProperty("db.pool.connection-timeout")); + properties.put("hibernate.hikari.idleTimeout", config.getProperty("db.pool.idle-timeout")); + properties.put("hibernate.hikari.maxLifetime", config.getProperty("db.pool.max-lifetime")); + + entityManagerFactory = Persistence.createEntityManagerFactory("MediaManagerPU", properties); + logger.info("Database connection initialized successfully"); + } catch (Exception e) { + logger.error("Failed to initialize database connection", e); + throw new RuntimeException("Failed to initialize database connection", e); + } + } + + public EntityManager createEntityManager() { + if (entityManagerFactory == null) { + throw new IllegalStateException("EntityManagerFactory is not initialized"); + } + return entityManagerFactory.createEntityManager(); + } + + public void shutdown() { + if (entityManagerFactory != null && entityManagerFactory.isOpen()) { + logger.info("Closing database connection..."); + entityManagerFactory.close(); + logger.info("Database connection closed successfully"); + } + } + + public boolean isInitialized() { + return entityManagerFactory != null && entityManagerFactory.isOpen(); + } +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index afbc2ee..1941ce8 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -9,7 +9,7 @@ org.hibernate.jpa.HibernatePersistenceProvider - + com.mediamanager.model.Media