Salut,
Je voudrais soumettre au forum une optimisation que j'ai fait, si certains peuvent me dire si ça leur paraît correct / justifié /propre / ...
J'ai un problème avec certaines sessions qui deviennent très volumineuses et quand je profile mon application je me rends compte qu'hibernate passe beaucoup de temps dans le "autoFlushIfRequired".
J'ai donc cherché à diminuer ce temps et je suis arrivé à la conclusion suivante : mes sessions volumineuses sont toujours en read-only. Il s'agit de sessions dans lesquelles je récupère un grand volume de données. Je me dis donc que pour ces sessions le flush en base n'est pas nécessaire. Je considère qu'il s'agit de sessions en read-only.
Arrétez moi si je me trompe mais en cherchant à la fois dans la doc et le code je n'ai pas trouvé de notion telle que celle-ci dans hibernate. J'ai bien trouvé comment mettre un objet en read-only mais il n'existe pas à ma connaissance un moyen d'ouvrir une session pour qu'elle soit entièrement en read-only et ne réalise aucun flush.
J'ai donc imaginé d'implémenter cette fonctionnalité moi-même, j'ai pour cela créé une sous classe de DefaultAutoFlushEventListener comme suit :
Code:
public class MyAutoFlushEventListener extends DefaultAutoFlushEventListener
{
private final static Logger LOGGER = Logger.getLogger(MyAutoFlushEventListener.class);
private static final long serialVersionUID = 1L;
@Override
public void onAutoFlush(AutoFlushEvent aEvent) throws HibernateException
{
if (isReadOnly())
{
LOGGER.debug("Transaction read-only, on ne flushe rien");
aEvent.setFlushRequired(false);
}
else
{
super.onAutoFlush(aEvent);
}
}
protected boolean isReadOnly()
{
// TODO retrouver l'information de read-only
}
}
Pour ma part, j'utilise Spring et je récupère donc auprès du transaction manager l'information de read-only. Cette information pourrait être récupérée autre part dans un autre contexte d'utilisation.
Deux questions me taraudent :
- Est-ce que le code que j'ai mis dans la méthode onAutoFlush est correct ? est ce la bonne façon d'indiquer à hibernate qu'il n'est pas nécessaire de faire un flush.
- Est-ce que cela paraît une bonne façon de gérer ce type de problème ou bien y a t'il une meilleure façon recommandée par les experts ?
Merci d'avance à ceux qui auront eu le courage de me lire jusque là et qui voudront bien me répondre