3

J'utilise le modèle Open Session in View pour mon application jsf/icesfaces. Comme d'habitude, un filtre de servlet ouvre et ferme toutes les sessions d'hibernation au début et à la fin d'un "thread de serveur web".hibernate 'session ouverte dans la vue' et les tâches asynchrones

Mon problème maintenant est que j'utilise des tâches asynchrones pour, par exemple. chargement de grandes listes d'objets à partir de la base de données. Par conséquent, je crée un nouveau fil "à la main" qui exécute la tâche.

Maintenant, ma question: quelle est la meilleure façon de gérer les sessions d'hibernation pour les tâches asynchrones? Dois-je créer manuellement une session dans le thread lui-même ou y a-t-il quelque chose comme un filtre de servlet pour les threads (quelque chose qui ouvre la session quand le thread démarre et la ferme quand il se termine)?

Je serais reconnaissant pour les meilleurs produits ou similaires. Je vous remercie.

Voici le code qui crée le fil:

protected static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 
      15, 50, TimeUnit.SECONDS, new LinkedBlockingQueue(20)); 

// called by action method of a button 
private void asyncLoading() { 

     SessionRenderer.addCurrentSession(this.renderGroup);    

     threadPool.execute(new Thread() { 
       // do the thing to do (...) 
       } 
} 

Répondre

0

D'une manière générale, les filtres "Open Session in View" sont assez simples: ouvrir une session, l'attacher à un ThreadLocal, fermez-le à la fin. Quels changements entre les implémentations est comment atteindre la session stockée dans le ThreadLocal. Donc, en fonction de l'implémentation partielle "Open Session in View" que vous utilisez, soit il existe une usine accessible qui n'est pas liée au filtre que vous utilisez, soit (dans presque tous les cas), vous pouvez jeter un coup d'œil à la source du filtrer, et imiter son traitement autour de "// faire la chose à faire (...)".

Questions connexes