2011-09-21 4 views
2

Nous utilisons une conversation Seam pour un assistant qui s'étend sur plusieurs pages, certains de ces écrans charge beaucoup de données pour la sélection de l'utilisateur (peut être plusieurs milliers d'enregistrements). La session Hibernate conserve tout, ce qui est un problème à la fois pour l'utilisation de la mémoire et les performances (car le flush prend plusieurs secondes).Hibernate session dans la conversation Seam devient trop grand

Est-ce que notre seule option est d'expulser des données au fur et à mesure que nous les chargeons ou y a-t-il une meilleure façon de les gérer?

Répondre

0

Si vous avez des écrans qui gardent plusieurs milliers d'enregistrements dans la session (en fonction, évidemment, de la taille de ces enregistrements) pendant une période prolongée, vous aurez sûrement des problèmes.

Comment résoudre le problème dépend de nombreux facteurs.

  • Est-ce des données à l'échelle de l'application qui peuvent être stockées dans un seul endroit?
  • Pouvez-vous le mettre en cache au niveau Hibernate (comme avec ehcache), ou dans ...
  • ... un cache externe qui se trouve entre l'application et la base de données?
  • Avez-vous besoin de garder all les données dans ces enregistrements, ou est-ce qu'un petit sous-ensemble (comme un ID et une étiquette) suffirait?

Etc.

+0

Les données sont mises en cache au niveau Hibernate en utilisant ehcache, mais elles se retrouvent dans la session Hibernate quand elles sont chargées. Nous avons besoin de toutes ces données. Actuellement, nous essayons d'utiliser une deuxième session Hibernate qui existe seulement autour de l'appel de service, pas sûr que c'est la meilleure option cependant. – David

0

Vous ne devez pas enregistrer tout dans une conversation. Il suffit de conserver les données insérées par l'utilisateur et d'utiliser une étendue d'événements pour les requêtes, et d'effectuer une requête chaque fois que vous accédez à la page de l'Assistant.

Ne conservez pas les résultats de la requête.

+0

Les résultats de la requête ne sont pas mis dans la conversation, la session Hibernate conserve les résultats et Seam maintient la session Hibernate en conversation. – David