From cc2e2e4ecf5bd8c4bbe16edba5a7d63fa808adcb Mon Sep 17 00:00:00 2001 From: Thomas Lenz Date: Fri, 26 Jul 2013 17:06:11 +0200 Subject: Bugfix: Database Session management --- .../moa/id/commons/db/ConfigurationDBRead.java | 70 +++++++++++++++++----- .../moa/id/commons/db/ConfigurationDBUtils.java | 38 +++++++----- .../moa/id/commons/db/MOASessionDBUtils.java | 18 +++--- 3 files changed, 89 insertions(+), 37 deletions(-) (limited to 'id/server/moa-id-commons/src/main/java/at/gv') diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBRead.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBRead.java index 7a6efc5ac..80d95628e 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBRead.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBRead.java @@ -8,6 +8,7 @@ import javax.persistence.EntityManager; import at.gv.egovernment.moa.id.commons.db.dao.config.MOAIDConfiguration; import at.gv.egovernment.moa.id.commons.db.dao.config.OnlineApplication; +import at.gv.egovernment.moa.id.commons.db.dao.config.UserDatabase; import at.gv.egovernment.moa.logging.Logger; import at.gv.egovernment.moa.util.MiscUtil; @@ -16,8 +17,11 @@ public class ConfigurationDBRead { private static Map QUERIES = new HashMap(); static { - QUERIES.put("getOnlineApplicationWithID", "select onlineapplication from OnlineApplication onlineapplication where onlineapplication.publicURLPrefix like SUBSTRING(:id, 1, LENGTH(onlineapplication.publicURLPrefix))"); + QUERIES.put("getOnlineApplicationWithID", "select onlineapplication from OnlineApplication onlineapplication where onlineapplication.publicURLPrefix like SUBSTRING(:id, 1, LENGTH(onlineapplication.publicURLPrefix)) and onlineapplication.isActive = '1'"); QUERIES.put("getMOAIDConfiguration", "select moaidconfiguration from MOAIDConfiguration moaidconfiguration"); + QUERIES.put("getAllOnlineApplications", "select onlineapplication from OnlineApplication onlineapplication"); + QUERIES.put("getUserWithUserID", "select userdatabase from UserDatabase userdatabase where userdatabase.id = :id"); + } @SuppressWarnings("rawtypes") @@ -26,20 +30,21 @@ public class ConfigurationDBRead { Logger.trace("Getting OnlineApplication with ID " + id + " from database."); List result; - EntityManager session = ConfigurationDBUtils.getCurrentSession(); - - javax.persistence.Query query = session.createQuery(QUERIES.get("getOnlineApplicationWithID")); - //query.setParameter("id", id+"%"); - query.setParameter("id", id); - result = query.getResultList(); + EntityManager session = ConfigurationDBUtils.getCurrentSession(); - Logger.trace("Found entries: " + result.size()); - - if (result.size() == 0) { - Logger.trace("No entries found."); - return null; - } - return (OnlineApplication) result.get(0); + javax.persistence.Query query = session.createQuery(QUERIES.get("getOnlineApplicationWithID")); + //query.setParameter("id", id+"%"); + query.setParameter("id", id); + result = query.getResultList(); + + Logger.trace("Found entries: " + result.size()); + + if (result.size() == 0) { + Logger.trace("No entries found."); + return null; + } + + return (OnlineApplication) result.get(0); } public static MOAIDConfiguration getMOAIDConfiguration() { @@ -57,8 +62,45 @@ public class ConfigurationDBRead { Logger.trace("No entries found."); return null; } + return (MOAIDConfiguration) result.get(0); } + public static List getAllOnlineApplications() { + Logger.trace("Get All OnlineApplications from database."); + + List result; + EntityManager session = ConfigurationDBUtils.getCurrentSession(); + + javax.persistence.Query query = session.createQuery(QUERIES.get("getAllOnlineApplications")); + result = query.getResultList(); + + Logger.trace("Found entries: " + result.size()); + + if (result.size() == 0) { + Logger.trace("No entries found."); + return null; + } + return result; + } + public static UserDatabase getUserWithID(long id) { + MiscUtil.assertNotNull(id, "UserID"); + Logger.trace("Getting Userinformation with ID " + id + " from database."); + + List result; + EntityManager session = ConfigurationDBUtils.getCurrentSession(); + + javax.persistence.Query query = session.createQuery(QUERIES.get("getUserWithUserID")); + query.setParameter("id", id); + result = query.getResultList(); + + Logger.trace("Found entries: " + result.size()); + + if (result.size() == 0) { + Logger.trace("No entries found."); + return null; + } + return (UserDatabase) result.get(0); + } } diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBUtils.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBUtils.java index 4bb0a08ea..d3ee1442e 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBUtils.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/ConfigurationDBUtils.java @@ -8,6 +8,7 @@ import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import org.hibernate.HibernateException; +import org.hibernate.Session; import at.gv.egovernment.moa.id.commons.db.ex.MOADatabaseException; @@ -44,10 +45,8 @@ public final class ConfigurationDBUtils { entitymanagerfactory = Persistence.createEntityManagerFactory("at.gv.egovernment.moa.id.commons.db.dao.config", props); - - - - Logger.debug("Initial session factory successfully created."); + + Logger.debug("Initial ConfigDB session factory successfully created."); } catch (Throwable ex) { @@ -72,10 +71,21 @@ public final class ConfigurationDBUtils { } EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); - // Open a new Session, if this Thread has none yet - if (session == null || !session.isOpen()) { - session = getNewSession(); - } + + if (session != null && session.isOpen()) { + + //maybe a hack, but sometimes we do not know if the session is closed (session already closed but isOpen()=true) + try { + javax.persistence.Query query = session.createQuery("select userdatabase from UserDatabase userdatabase"); + query.getResultList(); + + } catch (Throwable e) { + session = getNewSession(); + } + + } else + session = getNewSession(); + return session; } @@ -88,10 +98,10 @@ public final class ConfigurationDBUtils { } EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); if (session != null ) { - Logger.warn("Previous session has not been closed; closing session now."); + Logger.warn("Previous session has not been closed; closing ConfigDB session now."); closeSession(); } - Logger.debug("Opening new hibernate session..."); + Logger.debug("Opening new ConfigDB hibernate session..."); try { session = entitymanagerfactory.createEntityManager(); THREAD_LOCAL_CONFIG.set(session); @@ -114,7 +124,7 @@ public final class ConfigurationDBUtils { Logger.warn("Session is being automatically handled by hibernate. Therefore the current session cannot be closed on demand."); return; } - Logger.debug("Closing current hibernate session..."); + Logger.debug("Closing current ConfigDB hibernate session..."); EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); THREAD_LOCAL_CONFIG.set(null); if (session != null) { @@ -144,7 +154,7 @@ public final class ConfigurationDBUtils { return true; } catch(HibernateException e) { - Logger.warn("Error during database saveOrUpdate. Rollback.", e); + Logger.warn("Error during Config database saveOrUpdate. Rollback.", e); tx.rollback(); throw new MOADatabaseException(e); } @@ -171,7 +181,7 @@ public final class ConfigurationDBUtils { return true; } catch(HibernateException e) { - Logger.warn("Error during database saveOrUpdate. Rollback.", e); + Logger.warn("Error during Config database saveOrUpdate. Rollback.", e); tx.rollback(); throw new MOADatabaseException(e); } @@ -194,7 +204,7 @@ public final class ConfigurationDBUtils { return true; } catch(HibernateException e) { - Logger.warn("Error during database delete. Rollback.", e); + Logger.warn("Error during Config database delete. Rollback.", e); tx.rollback(); return false; } diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java index a89ede528..5e4ec0f13 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java @@ -38,7 +38,7 @@ public final class MOASessionDBUtils { String scm = StringUtils.trimToNull(hibernateProperties.getProperty(SESSION_HANDLING_KEY)); if (scm != null) { - automaticSessionHandling = scm.indexOf(AUTOMATIC_SESSION_HANDLING_VALUES[0]) != -1 || scm.indexOf(AUTOMATIC_SESSION_HANDLING_VALUES[1]) != -1; + automaticSessionHandling = scm.indexOf(AUTOMATIC_SESSION_HANDLING_VALUES[0]) != -1 || scm.indexOf(AUTOMATIC_SESSION_HANDLING_VALUES[1]) != -1; } Logger.debug("Evaluating hibernate property \"" + SESSION_HANDLING_KEY + "\"."); if (automaticSessionHandling) { @@ -48,15 +48,15 @@ public final class MOASessionDBUtils { } try { //Create the SessionFactory - Logger.debug("Creating initial session factory..."); + Logger.debug("Creating initial MOASession session factory..."); config.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory = config.buildSessionFactory(serviceRegistry); - Logger.debug("Initial session factory successfully created."); + Logger.debug("Initial MOASession session factory successfully created."); } catch (Throwable ex) { - Logger.error("Initial session factory creation failed: " + ex.getMessage()); + Logger.error("Initial MOASession session factory creation failed: " + ex.getMessage()); throw new ExceptionInInitializerError(ex); } } @@ -89,10 +89,10 @@ public final class MOASessionDBUtils { } Session session = (Session) THREAD_LOCAL.get(); if (session != null) { - Logger.warn("Previous session has not been closed; closing session now."); + Logger.warn("Previous MOASession session has not been closed; closing session now."); closeSession(); } - Logger.debug("Opening new hibernate session..."); + Logger.debug("Opening new MOASession hibernate session..."); try { session = sessionFactory.openSession(); THREAD_LOCAL.set(session); @@ -115,7 +115,7 @@ public final class MOASessionDBUtils { Logger.warn("Session is being automatically handled by hibernate. Therefore the current session cannot be closed on demand."); return; } - Logger.debug("Closing current hibernate session..."); + Logger.debug("Closing current MOASession hibernate session..."); Session session = (Session) THREAD_LOCAL.get(); THREAD_LOCAL.set(null); if (session != null) { @@ -141,7 +141,7 @@ public final class MOASessionDBUtils { return true; } catch(HibernateException e) { - Logger.warn("Error during database saveOrUpdate. Rollback.", e); + Logger.warn("Error during MOASession database saveOrUpdate. Rollback.", e); tx.rollback(); throw new MOADatabaseException(e); } @@ -161,7 +161,7 @@ public final class MOASessionDBUtils { return true; } catch(HibernateException e) { - Logger.warn("Error during database delete. Rollback.", e); + Logger.warn("Error during MOASession database delete. Rollback.", e); tx.rollback(); return false; } -- cgit v1.2.3