需要明确hibernate二级缓存

时间:2012-10-22 17:51:24

标签: java hibernate caching memcached

我需要对Hibernate二级缓存做一些澄清。

  1. hibernate二级缓存如何工作?

  2. 它是否在Java EE环境中的服务器启动的实体类中加载了表中有@Cacheable注释(关于hibernate注释)的所有数据?

  3. 当这些表有更新时,缓存是否会同步?

  4. 最后一个是否有任何方法可以让我的DAO代码在我感兴趣的某个表上有更新时得到通知? (寻找任何可以与表格更新密切相关的倾听者。)

2 个答案:

答案 0 :(得分:2)

  1. hibernate二级缓存如何工作?

    当您的实体被标记为可缓存时,如果您已配置了二级缓存,则hibernate将在第一次读取后将实体缓存到二级缓存。

    Hibernate提供了插入hibernates规范之后的任何缓存实现的灵活性。有关二级缓存和配置选项的更多详细信息,请参阅Hibernate Manual

  2. 是否在Java EE环境中启动的服务器上的实体类中加载了@Cacheable注释(关于hibernate注释)的表中的所有数据?

    我认为没有任何配置可以实现这一目标。间接地,您可以通过在启动时读取整个表来实现此目的,这可能会对系统启动时间产生负面影响。 (我不喜欢这个)。如果实体是在外部修改的,那么hibernate无法同步它,你最终会得到过时的数据。

  3. 当这些表有更新时,缓存是否会同步?

    表更新后,缓存不会立即更新。后续调用获取更新的记录将进入数据库,hibernate通过使用会话时间戳在内部实现此目的。

  4. 最后一个是否有任何方法可以让我的DAO代码在我感兴趣的某个表上有更新时得到通知? (寻找能够与表格更新密切相关的任何听众。)

    不,hibernate不支持此功能。

答案 1 :(得分:0)

  1. 这是一个太广泛的问题,无法在这里得到解答。

  2. 没有。它懒洋洋地填充缓存。每次从数据库中获取可缓存实体时,使用hibernate API或查询,此实体都存储在缓存中。稍后,当使用缓存中的实体的ID调用session.get()时,不需要数据库查询。

  3. 如果通过Hibernate进行更新,则更新缓存。如果使用外部应用程序,SQL查询或甚至批量更新HQL查询完成,则缓存不知道更新。这就是为什么你需要注意哪些实体可以缓存,你选择的生存时间等等。有时候,返回陈旧的值不成问题,有时候这是不可接受的。

  4. 没有。