6

我需要对 Hibernate 二级缓存进行一些说明。

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

  2. 它是否从在 Java EE 环境中启动的服务器上的实体类中具有 @Cacheable 注释(相对于休眠注释)的表中加载所有数据?

  3. 当这些表有更新时,缓存会同步吗?如何同步?

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

4

2 回答 2

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

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

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

  2. 它是否从在 Java EE 环境中启动的服务器上的实体类中具有 @Cacheable 注释(相对于休眠注释)的表中加载所有数据?

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

  3. 当这些表有更新时,缓存会同步吗?如何同步?

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

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

    不,休眠不支持这个。

于 2012-10-22T18:55:23.530 回答
0
  1. 这是一个太宽泛的问题,无法在这里回答。

  2. 不,它懒惰地填充缓存。每次从数据库中获取可缓存实体时,使用休眠 API 或查询,该实体都会存储在缓存中。稍后,当session.get()使用缓存中实体的 ID 调用时,不需要进行数据库查询。

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

  4. 不。

于 2012-10-22T18:46:29.210 回答