【问题标题】:Hibernate caching by example?例如休眠缓存?
【发布时间】:2013-07-26 04:21:35
【问题描述】:

几个缓存相关的Hibernate问题:

  1. 在 L1 缓存(基于会话的缓存)中,一旦会话关闭,缓存就会被丢弃/清除。但是使用 L2 缓存(应用程序/全局/分布式缓存),缓存什么时候被丢弃/清除/清除?有没有办法手动/以编程方式清除/刷新二级缓存?
  2. 您可以为二级缓存指定EhCacheCacheProvider。但是 EhCache 需要运行时类路径上的 ehcache.xml 配置文件来配置缓存。我可以在 ehcache.xml 中使用 Hibernate L2 缓存的特定名称对其进行微调吗?
  3. 如果程序 A 正在使用 Hibernate 管理的实体(一些处于持久状态的 POJO),因此被 Hibernate 主动管理/跟踪,并且单独的应用程序(程序 B)更新了相同的记录 - Hibernate 是否会自动更新内存中的 POJO?例如,我的 fizz.war Web 应用程序正在连接到 MySQL 服务器并管理一个持久的 User 实例(对应于 MySQL 中的 users 表)。目前,该用户的电子邮件是john.smith@example.com。然后,与此同时,buzz.war(另一个 Web 应用程序)将同一 users 记录的电子邮件更新到 jane.smith@example.com。 Hibernate 是否会自动更新 User 实例以包含更新?

【问题讨论】:

标签: java hibernate caching ehcache


【解决方案1】:

对于#1,有几个想法:

  • 让底层缓存实现(即 ehcache)通过使用时间(timeToLive、TimeToIdle)或容量(MaxelementInMemory)驱逐等概念为您执行驱逐...
  • 如果使用 hibernate 3.x,您可以直接从 sessionFactory 对象访问 evit*() 方法。
  • 或者,如果使用 Hibernate 4.x,您可以使用 evict*() 方法作为 org.hibernate.Cache 接口的一部分(SesisonFactory 之外的方法仍然存在......但已弃用)(@987654321 @ 例如,从缓存区域中驱逐所有实体:

    sessionFactory.getCache().evictEntityRegion(entitClass);

  • 最后,更多与底层 Cache 实现相关联(因此不太推荐):您可以获取 ehcache CacheManager 对象(通常是单例)的句柄,然后以这种方式驱逐条目。 .

    CacheManager.getInstance().clearAll();

//remove things from a specific cache
CacheManager.getInstance().getCache("cache").remove();

对于#3,不,休眠将不知道底层数据库后端是否正在被另一个应用程序更新(因此将无法清除外部更新的实体的 l2 缓存)......这可以追溯到到#1...您需要从buzz.war 实体更新中智能清除L2 缓存(如果您使用分布式缓存,例如ehcache + terracotta,这可能...)

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2012-04-29
    • 2015-01-05
    • 2011-11-18
    • 2017-01-16
    • 2011-06-18
    • 2011-10-13
    • 2012-03-14
    相关资源
    最近更新 更多