1

几个缓存相关的Hibernate问题:

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

1 回答 1

0

对于#1,有几个想法:

  • 让底层缓存实现(即ehcache)通过使用诸如时间(timeToLive,TimeToIdle)或容量(MaxelementInMemory)驱逐等概念为您完成驱逐......
  • 如果使用 hibernate 3.x,您可以直接从 sessionFactory 对象访问 evit*() 方法。
  • 或者,如果使用 Hibernate 4.x,您可以使用 evict*() 方法作为 org.hibernate.Cache 接口的一部分(SesisonFactory 之外的方法仍然存在......但已弃用)(http://docs .jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/Cache.html#evictEntity(java.lang.String,%20java.io.Serializable)...例如,从一个缓存区域:

    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,这可能...)

希望有帮助。

于 2013-07-25T20:21:35.263 回答