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

Вышеприведенный код - это то, как я определил свой класс Entity, UserDetails, как cacheable. Я также добавил две строки в hibernate.cfg.xml:Спящий режим второго уровня - Программа не заканчивается

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

В моей службе основного метода я доступ дважды один и то же UserDetails объект, в разных сеансах:

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(); 

я, как и следовало ожидать только один SELECT запроса , что означает, что hibernate извлекает данные из кеша второго уровня. Я также хорошо печатаю свои объекты на консоли.

Но моя программа не заканчивается. Он сидит там, на Eclipse, и я должен остановить его вручную. Я делаю что-то неправильно? Благодарю.

ответ

1

Что не так, так это то, что вы не закрываете SessionFactory, который поддерживает множество системных ресурсов. Некоторые из этих ресурсов должны быть потоками, которые не позволяют вашему приложению заканчиваться.

+0

Большое спасибо. Хорошего дня. – yovan786