view backend/src/main/java/org/dive4elements/river/backend/SessionHolder.java @ 8566:fe7e9da6312a

(issue1797) Move close into session release and guard it. To avoid leaking open and Held sessions we centrally close the session in the SessionHolder on release. This also removes some duplicated code in SedDBSessionHolder
author Andre Heinecke <andre.heinecke@intevation.de>
date Tue, 24 Feb 2015 17:16:14 +0100
parents 4c3ccf2b0304
children 9bbce0edd36b
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.backend;

import org.apache.log4j.Logger;

import org.hibernate.Session;
import org.hibernate.SessionFactory;


public class SessionHolder
{
    private static Logger log =
        Logger.getLogger(SessionHolder.class);

    public static final ThreadLocal<Session> HOLDER =
        new ThreadLocal<Session>() {
            @Override
            protected Session initialValue() {
                return create();
            }
        };

    protected SessionHolder() {
    }

    public synchronized static Session create() {
        log.debug("create");
        SessionFactory sessionFactory =
            SessionFactoryProvider.getSessionFactory();
        return sessionFactory.openSession();
    }

    public static Session acquire() {
        log.debug("acquire");
        Session session = create();
        HOLDER.set(session);
        return session;
    }

    public static void release() {
        log.debug("release");
        Session session = HOLDER.get();
        if (session != null) {
            try {
                if (!session.isOpen()) {
                    /* If this check really works in all cases why does hibernate
                     * does not use it when you call close anyway. */
                    log.debug("Session is not open. Calling close anyway.");
                }
                session.close();
            } catch (Exception e) {
                /* Do not try this at home. But hibernate may fail with an NPE
                 * or any other exception depending on the state of the session.
                 * According to doc this should only throw a HibernateException but
                 * we definetely get NPE's here.
                 */
                log.error("Exception caught on session close! Session already closed?" + e.getMessage());
            }
        }
        HOLDER.remove();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org