Bonjour,
J'ai besoin d'un petit éclaircissement concernant SessionFactory et la gestion des sessions.
Mon application tourne avec Struts et Hibernate sous une BDD Oracle, et jusqu'à maintenant à chaque fois que j'avais besoin d'accéder à la base je faisais :
avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Session connectionBDD = HibernateSessionFactory.getSession(); Transaction tx = connectionBDD.beginTransaction(); ... tx.commit(); connectionBDD.disconnect(); HibernateSessionFactory.closeSession();
Je commence à douter de la façon dont je gère les sessions... enfin surtout comment je les ferme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION; static { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err .println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private HibernateSessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err .println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory * */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } }
Le truc c'est que du côté d'Oracle(en regardant avec TOAD les sessions actives et inactives connectées), même en ayant fermé les sessions côté java, j'ai toujours ma session en inactive.
Je ne sais pas justement si ça vient de mon code ou s'il y a un paramètre sur Oracle qui garde les sessions inactives pendant un certain temps (mais alors assez long parce qu'elles restent plus de 2h facile, j'ai pas testé plus).
Et aussi, session.disconnect() fait quoi exactement ? C'est utile de le mettre si on fait un .close() tout de suite après ?
Partager