2013-05-23 1 views
2
@Entity 
@Table(name="user_details") 
@Cacheable 
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY) 
public class UserDetails {...} 

Le code ci-dessus est comment j'ai défini ma classe Entity, UserDetails, comme cacheable. J'ai également ajouté deux lignes dans le hibernate.cfg.xml:Hibernate cache de second niveau - Le programme ne se termine pas

<!-- second-level cache --> 
    <property name="cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

Dans ma méthode de service principal J'accède deux fois les mêmes UserDetails objet, dans différentes sessions:

session = sessionFactory.openSession(); 
session.beginTransaction(); 
UserDetails user = new UserDetails(); 
user = (UserDetails)session.get(UserDetails.class, 3); 
logger.info(user); 
session.getTransaction().commit(); 
session.close(); 

Session session2 = sessionFactory.openSession(); 
session2.beginTransaction(); 
UserDetails user2 = new UserDetails(); 
user2 = (UserDetails)session2.get(UserDetails.class, 3); 
logger.info(user2); 
session2.getTransaction().commit(); 
session2.close(); 

je reçois, comme prévu une seule SELECT requête , ce qui implique que hibernate récupère les données du cache de second niveau. J'imprime aussi bien mes objets sur la console.

Mais, mon programme ne se termine pas. Il est là en cours d'exécution, sur Eclipse, et je dois l'arrêter manuellement. Est-ce que je fais quelque chose de mal? Merci.

Répondre

1

Quel est le problème est que vous n'arrêtez pas le SessionFactory, ce qui maintient beaucoup de ressources système. Certaines de ces ressources doivent être des threads, ce qui empêche votre application de se terminer.

+0

Merci beaucoup. Bonne journée. – yovan786

Questions connexes