@Entity
@Table(name="user_details")
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class UserDetails {...}
以上代码是我将我的实体类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>
在我的service main方法中,我在不同的会话中访问了两次相同的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
上运行,我必须手动停止它。难道我做错了什么?感谢。
答案 0 :(得分:1)
错误的是你没有关闭SessionFactory
,它会维护很多系统资源。其中一些资源必须是线程,这样可以防止应用程序结束。
答案 1 :(得分:0)
尝试更改ehcache的版本。我试过这个东西而且很有效。看到这个 http://forums.terracotta.org/forums/posts/list/6450.page