Hibernate二级缓存懒惰集合大小

时间:2013-03-01 10:13:29

标签: hibernate caching

我们使用以下属性在hibernate上启用了二级缓存:

hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
hibernateProperties.setProperty("hibernate.cache.use_query_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_structured_entries", Boolean.TRUE.toString());     
hibernateProperties.setProperty("hibernate.cache.generate_statistics", Boolean.TRUE.toString());

使用缓存标记标记我们的实体:

@Entity
@Indexed
@Table(name = "item")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Item implements Serializable {

此实体具有延迟集合,其中包含额外的延迟集合选项:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, mappedBy = "likes")
@LazyCollection(LazyCollectionOption.EXTRA)
private List<User> users;

这似乎运行良好,我在缓存数据后没有看到任何数据库查询,但我们看到的是调用日志

select count(user_id) from user_items where item_id =?

有没有办法让hibernate缓存延迟集合的大小,以便在我们执行users.size()时不需要访问数据库?


我已更改为CacheConcurrencyStrategy.READ_WRITE并查看相同的行为。

在第一个请求中,我看到选择实体的查询和查询以查找集合的大小。我看到日志消息说实体正在被缓存。

在后续请求中,没有调用加载实体,但仍有调用来查找集合的大小。

2 个答案:

答案 0 :(得分:0)

缓存数据时,您永远不会看到数据库查询。而且你说有连续的选择查询日志。 Ehcache不提供事务缓存。 你说这是有效的。 兄弟,它不工作你只是有数据库调用和相同的日志。 检查Ehcache文档,因为它不支持TRANSACTIONAL缓存

答案 1 :(得分:0)

用户列表是一个延迟加载的集合。 在Lazy loaded collection中,您将没有任何数据。 每当您想要访问延迟加载的集合或想要确定延迟加载集合的大小时,它必须具有有关其中的数据的信息,例如有多少元素。 为此,它将从数据库中获取数据,因此每次都会生成数据库查询。 我检查了列表中的最高级别和其他一些对象。 这表明当List不是顶级对象时,它将被懒惰地初始化。 因此,无论何时您希望获得有关集合的信息,或者从集合中获取信息,都会生成数据库查询。