JPA2和EclipseLink-尝试理解缓存
我想了解JPA2中使用EclipseLink作为持久性提供者的缓存。我不知道我的想法是否正确 例如: 我使用JTA事务。在一些名为JPA2和EclipseLink-尝试理解缓存,jpa,eclipselink,Jpa,Eclipselink,我想了解JPA2中使用EclipseLink作为持久性提供者的缓存。我不知道我的想法是否正确 例如: 我使用JTA事务。在一些名为A的实体类上,我声明了@Cacheable(true)注释。我从EJB bean调用一个方法,该方法更新a.class对象。第一次调用em.find(A.class,1)。我的问题是什么是搜索顺序。我展示我的思维方式 EntityManager在二级缓存中搜索实体。如果EM找到该对象,它会将该对象复制到一级缓存并停止搜索 ElseEntityManager在一级缓存中
A
的实体类上,我声明了@Cacheable(true)
注释。我从EJB bean调用一个方法,该方法更新a.class
对象。第一次调用em.find(A.class,1)
。我的问题是什么是搜索顺序。我展示我的思维方式
EntityManager
在二级缓存中搜索实体。如果EM
找到该对象,它会将该对象复制到一级缓存并停止搜索EntityManager
在一级缓存中搜索实体。如果EM
找到该对象,它将停止搜索EntityManager
在数据库中搜索实体。如果EM
找到该对象,它会将该对象放入一级缓存并停止搜索当我找到object时,我修改了几个字段,我想调用
em.merge(aClassRepresentant)
。我认为当事务停止时,EntityManager会将合并的aClassRepresentant
放入二级缓存并销毁自身。我想得对吗?问得好。因此,如果通过emf.getCache().executeAll()
使二级缓存无效,那么在下一次查询中,返回到步骤1,我们将丢失对象的更新版本,因为一级缓存将被搜索?现在我认为应该交换步骤1和步骤2。一级缓存的生命周期类似于事务生命周期。当我们调用新的business方法时,一级缓存是空的。如果我们想在上一个缓存中找到一个实体,而二级缓存不包含该实体,则EntityManager
从数据源获取搜索对象。如果在数据源中找到对象,EclipseLink将tat对象复制到一级和二级缓存。当然,我们必须使用EntityManager.find()
方法或NameqQuery
,它通过id
或放置在实体类上的@Index
注释中定义的索引来获取实体。NamedQuery
必须返回单个结果,如果没有,找到的实体将不会放置在二级缓存中…顺序将是EM缓存,然后是EMF缓存,然后是数据库。如果它访问数据库,并且它处于一个有更改的事务中,那么它读取的内容将只放在EM缓存中,直到事务提交,这时它将把它拥有的内容合并到EMF缓存中。问得好。因此,如果通过emf.getCache().executeAll()
使二级缓存无效,那么在下一次查询中,返回到步骤1,我们将丢失对象的更新版本,因为一级缓存将被搜索?现在我认为应该交换步骤1和步骤2。一级缓存的生命周期类似于事务生命周期。当我们调用新的business方法时,一级缓存是空的。如果我们想在上一个缓存中找到一个实体,而二级缓存不包含该实体,则EntityManager
从数据源获取搜索对象。如果在数据源中找到对象,EclipseLink将tat对象复制到一级和二级缓存。当然,我们必须使用EntityManager.find()
方法或NameqQuery
,它通过id
或放置在实体类上的@Index
注释中定义的索引来获取实体。NamedQuery
必须返回单个结果,如果没有,找到的实体将不会放置在二级缓存中…顺序将是EM缓存,然后是EMF缓存,然后是数据库。如果它访问数据库,并且它处于一个有更改的事务中,那么它读取的内容将只放在EM缓存中,直到事务提交,此时它将把它拥有的内容合并到EMF缓存中。