Caching jpa2&x2B;EclipseLink:缓存问题

Caching jpa2&x2B;EclipseLink:缓存问题,caching,eclipselink,jpa-2.0,guice,guice-persist,Caching,Eclipselink,Jpa 2.0,Guice,Guice Persist,我在缓存和JPA实体(EclipseLink 2.4.1)+GUICE持久化方面有一个奇怪的行为 我不会使用缓存,但是我会随机得到一个在MySQL数据库中已经更改的旧实例 我尝试了以下方法: 将@Cacheable(false)添加到JPA实体 禁用persistence.xml文件中的缓存属性: MyEntity 没有一个 即使激活trace EclipseLink,我也可以看到JPQL查询: ReadObjectQuery执行查询(name=“readObject”referenceC

我在缓存和JPA实体(EclipseLink 2.4.1)+GUICE持久化方面有一个奇怪的行为

我不会使用缓存,但是我会随机得到一个在MySQL数据库中已经更改的旧实例

我尝试了以下方法:

  • 将@Cacheable(false)添加到JPA实体

  • 禁用persistence.xml文件中的缓存属性:

  • MyEntity
    没有一个
    

    即使激活trace EclipseLink,我也可以看到JPQL查询:

    ReadObjectQuery执行查询(name=“readObject”referenceClass=XX sql=“…”(只需调用“查找”entityManager

    但是,随机返回该类的旧值

    注意 使用EntityManager的不同实例可能会发生什么情况,每个人都有自己的缓存? 我看过以下相关文章:禁用JPA EclipseLink 2.4缓存 如果是,是否可以清除所有EntityManager的缓存,而不使用:???? em.getEntityManagerFactory().getCache().ReceictAll();
    是否可以清除所有缓存而不使用executeAll???

    execute ALL用于您已经禁用的共享缓存。默认情况下,EntityManager实例需要有自己的一级缓存,以跟踪其创建的所有托管实例。EntityManager用于表示逻辑事务因此不会长久存在。您需要扔掉EntityManager并重新获取它们,或者只是在逻辑点清除它们,而不是让其缓存中的托管实体数量无休止地增长。这也将有助于限制过时的数据问题,尽管只有悲观锁定才能消除它。我建议使用optim如果您尚未避免使用过时数据覆盖,请执行以下操作。

    管理我正在使用的JPA持久性。每次执行JPA事务时,我都会通过注入EntityManager的提供程序来获取EntityManager的实例:“@InjectProvider”…提供程序返回的EntityManager实例可能没有刷新??在您链接的e doc,GUICE描述了每个事务的会话以及每个http请求的会话。第一个听起来像我描述的一样-基于当前事务的短期,而第二个似乎更长,并且将缓存您读取的内容。如果使用第二个,您需要调用em.clear()必要时清除本地缓存。谢谢Chris。文档实际上提到了两种类型(会话-每事务策略/会话-每http-请求),但是,这有点令人困惑。通常,正如Web应用程序文档中所解释的,是定义servlet的入口点(“但是,如果您在文档中看到在Servlet中设置持久性入口点的地方,请注意以下内容:“公共类扩展MyModule ServletModule{protected void configureServlets(){install(新JpaPersistModule(“myJpaUnit”))“这是最常见的方法。但是如果你注意到,你在那里做的就是在你有的地方调用persistence.xml文件:那么,你使用的是什么样的策略,每事务会话策略(RESOURCE_LOCAL)还是每http请求会话?这有点让人困惑。有一个“脏”的问题我在论坛上读到,通过AOP拦截器(bindInterceptor)关联一个EntityManager,以便在“清除”实例之前返回实例。这有点令人困惑。持久化单元属性独立于GUI设置,只指定如何/谁将控制事务并将其绑定到EM(资源本地vs JTA)。GUI设置是问题所在,就像您将em绑定到Http会话一样,通过该Http会话读取的所有内容都缓存在em中。这允许在事务启动和提交时拾取和刷新所有更改,但需要付出代价—缓存使用的内存以及无法拾取在其他位置进行的更改t刷新或清除缓存。
         <class>MyEntity</class>
         <shared-cache-mode>NONE</shared-cache-mode>    
         <properties>      
    
                <property name="eclipselink.cache.shared.default" value="false"/>
             <property name="eclipselink.cache.size.default" value="0"/>
            <property name="eclipselink.cache.type.default" value="None"/>
            <property name="eclipselink.refresh" value="true"/>
            <property name="eclipselink.query-results-cache" value="false"/>
                <property name="eclipselink.weaving" value="false"/>          
         </properties>