annotate 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
rev   line source
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5992
4c3ccf2b0304 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5992
4c3ccf2b0304 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
6 * documentation coming with Dive4Elements River for details.
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5829
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
9 package org.dive4elements.river.backend;
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
10
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
11 import org.apache.log4j.Logger;
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
12
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
13 import org.hibernate.Session;
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
14 import org.hibernate.SessionFactory;
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
15
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
16
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
17 public class SessionHolder
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
18 {
3333
76c75c8b9ee0 SedDB: Make access to SedDB configurable over conf.xml and provide access to sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 466
diff changeset
19 private static Logger log =
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
20 Logger.getLogger(SessionHolder.class);
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
21
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
22 public static final ThreadLocal<Session> HOLDER =
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
23 new ThreadLocal<Session>() {
3333
76c75c8b9ee0 SedDB: Make access to SedDB configurable over conf.xml and provide access to sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 466
diff changeset
24 @Override
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
25 protected Session initialValue() {
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
26 return create();
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
27 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
28 };
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
29
8566
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
30 protected SessionHolder() {
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
31 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
32
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
33 public synchronized static Session create() {
3333
76c75c8b9ee0 SedDB: Make access to SedDB configurable over conf.xml and provide access to sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 466
diff changeset
34 log.debug("create");
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
35 SessionFactory sessionFactory =
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
36 SessionFactoryProvider.getSessionFactory();
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
37 return sessionFactory.openSession();
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
38 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
39
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
40 public static Session acquire() {
3333
76c75c8b9ee0 SedDB: Make access to SedDB configurable over conf.xml and provide access to sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 466
diff changeset
41 log.debug("acquire");
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
42 Session session = create();
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
43 HOLDER.set(session);
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
44 return session;
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
45 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
46
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
47 public static void release() {
3333
76c75c8b9ee0 SedDB: Make access to SedDB configurable over conf.xml and provide access to sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 466
diff changeset
48 log.debug("release");
8566
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
49 Session session = HOLDER.get();
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
50 if (session != null) {
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
51 try {
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
52 if (!session.isOpen()) {
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
53 /* If this check really works in all cases why does hibernate
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
54 * does not use it when you call close anyway. */
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
55 log.debug("Session is not open. Calling close anyway.");
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
56 }
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
57 session.close();
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
58 } catch (Exception e) {
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
59 /* Do not try this at home. But hibernate may fail with an NPE
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
60 * or any other exception depending on the state of the session.
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
61 * According to doc this should only throw a HibernateException but
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
62 * we definetely get NPE's here.
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
63 */
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
64 log.error("Exception caught on session close! Session already closed?" + e.getMessage());
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
65 }
fe7e9da6312a (issue1797) Move close into session release and guard it.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 5992
diff changeset
66 }
466
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
67 HOLDER.remove();
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
68 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
69 }
8bd50b41dea6 Moved the SessionHolder from flys-artifacts to flys-backend.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
70 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org