These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Gestion du flush dans les transactions read/only
PostPosted: Mon Oct 02, 2006 5:36 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
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

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 15, 2006 6:08 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Pour information cela est géré automatiquement par Spring.

Spring possède une notion de transaction en read-only. Par défaut pour ce type de transaction, Spring définit le mode de flush d'hibernate à NEVER. Cela augment grandement les performances des transactions read-only qui comme dans mon cas passaient beaucoup de temps à vérifier ce qu'il y a à flusher lorsque la transaction est volumineuse

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject: Ca existe deja
PostPosted: Mon Nov 20, 2006 6:57 pm 
Newbie

Joined: Mon Nov 20, 2006 5:16 pm
Posts: 7
Location: PARIS
Il suffit de mettre le flush mode sur la session a never ...

http://www.hibernate.org/hib_docs/v3/ap ... .FlushMode)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.