Bonjour,

je suis en train de développer une application client serveur, en utilisant les sockets.

Le serveur quand il reçoit un client créé un thread de traitement.
J'utilise Hibernate pour la persistance des données, avec la classe utilitaire HibernateUtil :

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
public class HibernateUtil {
 
	private static final SessionFactory sessionFactory;
 
	static { 
		try {
			// Crée la SessionFactory
			Configuration c = new Configuration();
			c.setProperty("hibernate.show_sql", "false");
			sessionFactory = c.configure().buildSessionFactory();
		} catch (HibernateException ex) {
			throw new RuntimeException("Problème de configuration : "
					+ ex.getMessage(), ex);
		}
	}
 
	public static final ThreadLocal session = new ThreadLocal();
 
	public static Session currentSession() throws HibernateException {
		Session s = (Session) session.get();
		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
		if (s == null) {
			s = sessionFactory.openSession();
			session.set(s);
		}
		return s;
	}
 
	public static void closeSession() throws HibernateException {
		Session s = (Session) session.get();
		session.set(null);
		if (s != null)
			s.close();
	}
 
	public static SessionFactory getSessionfactory() {
		return sessionFactory;
	}
}
J'ai développé un programme qui exécute un client toutes les n minutes, afin de vérifier que le serveur est toujours vivant.
Cela fonctionne très bien, mais toutes les 1h30 (à peu près) la ligne "query.list();" ne répond plus, et bloque le thread client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Session session = HibernateUtil.currentSession();
Query query = session.createQuery(hql);
query.list();
Après le blocage, tous les autres threads clients ne peuvent plus exécuter de requête à leur tour.
Je pré-suppose que dans une application multi-threads, cette classe n'est pas vraiment compatible, car les threads utilisent toujours la même session.
Mais j'ai beau créé un threadLocal, une session Hibernate
pour chaque thread, le problème persiste...

Existe-t-il une classe utilitaire qui gère les sessions dans un contexte multi-threading ?
Ou dans quelle direction puis-je me diriger pour avoir toujours une bonne session pour ne plus avoir ce blocage ?