当前位置: 首页 > 知识库问答 >
问题:

尝试逐出第二级缓存

闻人和泽
2023-03-14

我正试图驱逐我的持久性实体管理器中的二级缓存。看起来我可以使用javax.persistence.Cache接口中定义的以下函数:

/**
 * Clear the cache.
 */
public void evictAll();

为了得到Cache对象,我可以使用javax.persistence.EntityManagerFactory接口中定义的以下函数:

/**
 * Access the cache that is associated with the entity manager
 * factory (the "second level cache").
 * @return instance of the <code>Cache</code> interface
 * @throws IllegalStateException if the entity manager factory
 * has been closed
 *
 * @since Java Persistence 2.0
 */
public Cache getCache();

我连接我的EntityManagerFactory是这样的:

@Repository("persistenceManager")
public class PersistenceManager
{
    public EntityManagerFactory emf;

    @PersistenceUnit(unitName="snap")
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
        ...
}

使用以下applicationContext配置文件:

< bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    < property name="persistenceUnitName" value="snap" />
    < property name="persistenceUnitManager" ref="pum" />

当我对对象调用getCache()时,我得到以下异常:

导致:Java . lang . abstract method error:org . hibernate . EJB . entitymanagerfactoryimpl . get Cache()lja VAX/persistence/Cache;在sun . reflect . nativemethodaccessorimpl . invoke 0(本机方法)在sun . reflect . nativemethodaccessorimpl . Java:39)在sun . reflect . delegatingmethodaccessorimpl . invoke(delegatingmethodaccessorimpl . Java:25)在Java . lang . reflect . Method . invoke(Method . Java:597)在org . spring framework . ORM . JPA . abstractentitymanagerfactorybean . invokeproxymethod(abstractentitym

这向我表明getCache(在接口中定义)实际上并没有在连接到EntityManagerFactory的对象中实现。因此,我在setEntityManagerFactory(EntityManagerFactory emf)中放了一个breakboint,我注意到该对象的具体类型实际上是:org . spring framework . ORM . JPA . localcontainereentitymanagerfactorybean

当我浏览这个类的源代码时,我可以确认这里没有实现getCache()。我相信我使用的是正确/兼容的版本:

  • Hibernate3.6.10
  • Spring3.1.1
  • JPA 2.0

有人遇到过类似的问题或者能够重现这个问题吗?我该如何解决这个问题?如果不是,那么从二级缓存中清除所有缓存项的替代方法是什么?

共有1个答案

林烨华
2023-03-14

hibernate有不同的缓存实现。在hibernate属性文件中,使用属性hibernate.cache。provider_class设置具体的缓存类。

 类似资料:
  • 我有一个关于内存系统遵循的策略的基本问题。 考虑一个具有私有L1和L2缓存的核心。在L2缓存之后,我们有一个相干流量运行的总线。现在,如果从L2高速缓存中逐出地址(X)的高速缓存行,是否有必要从L1高速缓存中逐出该地址?? 逐出的原因可能是它有助于保持一致性协议的不变[如果l2中的一行显示无效,则此核心不包含此地址]。

  • 我计划使用infinispan作为我的Hibernate应用程序二级缓存。My all entities具有生命周期属性[新建- 简单地说,当实体生命周期属性状态到达已完成状态时,我想从缓存中驱逐实体。据我所知,Infinispan不支持自定义驱逐策略。处理我的情况的最佳方式是什么?

  • 问题内容: 谁能用简单的语言解释一下Hibernate中的一级和二级缓存是什么? 问题答案: 1.1)一级缓存 一级缓存 始终与 Session对象 关联。Hibernate默认使用此缓存。在这里,它处理一个事务接一个另一个事务,意味着不会多次处理一个事务。主要是它减少了在给定事务中需要生成的SQL查询的数量。那不是在事务中完成每次修改之后更新,而是仅在事务结束时更新事务。 1.2)二级缓存 二级

  • 当你使用本地(在内存中)缓存时,服务器可以缓存一些信息并快速地检索它,但是其他服务器不能访问这个缓存数据,他们需要到数据库中查询同样的信息。 如果你喜欢使用分布式缓存让其他服务器访问缓存的数据,由于它有一些序列化/反序列化和网络延迟开销,则需要注意:在某些情况下,它可能会降低性能。 缓存需要处理的另一个问题:缓存失效。 There are only two hard things in Compu

  • 问题内容: 我正在使用Spring + JPA + Hibernate。我正在尝试启用Hibernate的二级缓存。在我的春天,我有: 运行时出现错误: 所以有人抱怨我没有启用二级缓存。我试图通过添加到我的启用它: 但是仍然没有喜悦。我还尝试将其添加到ehcache.xml中: 但这仍然行不通。将更改为也无济于事: 我的实体类被注释为使用缓存 那么,如何启用二级缓存? 编辑: 这是在bean下:

  • 在我的项目中,我使用了一个@Cacheable注释ia一个服务方法,它返回涉及书籍和一些标记的计算结果,我想在一个@Controller类方法中退出缓存,该方法将一本新书添加到数据库中,因为这本新书将是新计算所必需的。 服务类:@Cacheable("metas") 控制器类:@RequestMapping@CacheEvict(value=“metas”,allEntries=true)