Bonjour à tous,

J'ai une grande question qui me vient à l'esprit depuis peu, et peut-être que quelqu'un pourra y répondre correctement.

Tout d'abord, le cadre : pour un gros projet en Flex, j'utilise Hibernate au niveau de la persistance et LiveCycle data services/JRun pour la communication client/serveur.
Depuis un bon moment déjà, nous avons un problème récurrent : après 8 heures d'activité environ, le serveur renvoie une erreur du type "broken pipe" lors de requêtes sur une base de données mysql (5). L'hébergeur nous a proposé de doubler la RAM, ce qui a été fait, et maintenant le problème se déclenche après le double du temps, 16 heures, tout simplement... Le problème n'est donc pas réglé avec un apport de ram supplémentaire

J'ai lu pas mal de choses sur le sujet, que c'était en rapport direct avec le serveur de base de données. Le réel problème est que nous avons des pics de consommation au niveau de la ram.

J'ai suivi les instructions concernant les sessions au niveau de hibernate, rajouté des try/catch dans tous mes appels aux sessions hibernate, du type :

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
 
Session s = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction t = null;
 
try
{
	// create transaction, set query/params and commit transaction
	t = s.beginTransaction();
 
	List l = s.createQuery("From MyVO").list();
	t.commit();
 
	return l;
}
catch( RuntimeException e )
{
	if( t != null )
		if( s.isOpen() )
			t.rollback();
	throw e;
}
finally
{
	if( s.isOpen() )
		s.close();
}
Avec ce type de code, je pensais que les sessions étaient fermées automatiquement dès lors que le code a été exécuté. Mais alors pourquoi cette montée en charge de la ram...? J'ai mis en place un pool de connexion (c3p0) mais nous ne l'avons pas encore testé sur le serveur de démonstration (ça ne saurait tarder).

J'ai lu dans un forum que ce problème apparaissait lors de longues sessions entre client et serveur attachées à une base de données avec timeout. Les connexions au serveur via mon application nécessitent une persistance "durant le travail", mais j'ai l'impression qu'elle perdure après la fermeture de session de l'utilisateur (logout de l'application Flex).

Mes questions sont les suivantes :

1. si j'ai des blocs try/catch partout qui permette de fermer la session hibernate en cours (s.close()) pourquoi est-ce que la session semble rester ouverte avec le serveur, même lorsque l'application cliente a été fermée dans le navigateur ? ça ne me semble pas très normal...

2. est-ce qu'en plus de fermer la session "courante" récupérée via HibernateUtil.getSessionFactory().getCurrentSession() je devrai fermer la "sessionFactory" ? j'ai constaté qu'en faisant HibernateUtil.getSessionFactory(). j'avais accès à une méthode close() également...

3 Si je tente de fermer la "sessionFactory" pour un utilisateur particulier qui demande un logout alors est-ce que ça aura une incidence sur les autres utilisateurs qui sont encore loggés ?

J'ai un peu de peine à bien comprendre comment totalement déconnecter une session utilisateur car il semblerai que même une fois l'utilisateur déconnecté, sa session reste en mémoire, et je me retrouve avec des pics de consommation RAM qui finissent par bloquer le serveur.

Si quelqu'un s'y connait bien dans le domaine, pourrait-il m'orienter vers une manière propre de fermer ces sessions qui restent ouvertes sans que je sache vraiment pourquoi ?


D'avance merci pour vos conseils et suggestions

Cordialement,


Thierry