gpt4 book ai didi

java - Hibernate 缓存的例子?

转载 作者:行者123 更新时间:2023-12-01 04:32:25 25 4
gpt4 key购买 nike

几个与缓存相关的 Hibernate 问题:

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

最佳答案

对于#1,有几点想法:

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

    sessionFactory.getCache().evictEntityRegion(entitClass);

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

    CacheManager.getInstance().clearAll();

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

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

希望有帮助。

关于java - Hibernate 缓存的例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17848252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com