通过示例进行Hibernate缓存?

时间:2013-07-25 02:57:39

标签: java hibernate caching ehcache

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

  1. 在L1缓存(基于会话的缓存)中,只要会话关闭,就会删除/清除缓存。但是使用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实例(对应于MySQL中的users表)。目前,此用户的电子邮件是john.smith@example.com。然后,同时buzz.war(另一个网络应用)将同一users条记录的电子邮件更新为jane.smith@example.com。 Hibernate会自动更新User实例以包含更新吗?

1 个答案:

答案 0 :(得分:0)

对于#1,几个想法:

  • 让底层缓存实现(即ehcache)通过使用诸如time(timeToLive,TimeToIdle)或capacity(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)...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,这是可能的......)

希望有所帮助。