2
@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>

在我的服务主要方法中,我在不同的会话中访问了两次相同的 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查询,这意味着休眠从二级缓存中获取数据。我还在控制台上打印了我的对象。

但是,我的程序并没有结束。它坐在那里运行,Eclipse我必须手动停止它。难道我做错了什么?谢谢。

4

2 回答 2

1

问题是你没有关闭SessionFactory,维护了大量的系统资源。其中一些资源必须是线程,这会阻止您的应用程序结束。

于 2013-05-23T10:20:21.273 回答
0

尝试更改 ehcache 的版本。我已经尝试过这个东西并且它有效。请参阅此 http://forums.terracotta.org/forums/posts/list/6450.page

于 2014-04-10T09:37:47.500 回答