spring数据ehcache在多节点环境中返回过时数据

时间:2015-02-17 16:26:51

标签: hibernate spring-data ehcache spring-data-jpa

使用以下代码,ehcache不会反映多节点(JVM)环境中的最新数据。相反,spring数据存储库方法返回过时数据。这段代码中缺少什么来返回最新数据?来自以下Foo JPA存储库的findByName方法返回陈旧数据。在第一次调用时,它会缓存数据。在后续调用中(经过timeToLiveSeconds之后),即使DB中的实体数据发生了变化,我仍然可以获得相同的缓存数据。我希望timeToLiveSeconds会导致缓存过期并在后续调用中重新加载数据。

在接收db更新调用的node-1上,缓存按预期更新。即findByName方法返回最新数据。另一个节点上的相同调用返回过时数据。 (即使在timeToLiveSeconds过去之后)

//Entity class
@Entity
@SecondaryTable(name = "foo_content") 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Foo {
@Id
@GeneratedValue(generator = "test")
@GenericGenerator(name = "test", strategy = "sequence",
 parameters = { @Parameter(name = "sequence", value = "hibernate_seq") })
private int primaryKey;
@NotNull private String name;
private int version;
@NotNull
@Lob
@Column(table = "foo_content")
private String content;
}

//Foo JPA repository:
public interface FooRepository extends JpaRepository<Foo, Integer> {
@Query("SELECT foo FROM Foo foo WHERE foo.name = ?1 AND foo.version = (SELECT MAX(t.version) from Foo t WHERE t.name = ?1)")
@QueryHints({@QueryHint(name = "org.hibernate.cacheable", value = "true")}) Foo findByName(String name);
}

ehcache.xml中

<cache name="com.blah.blah.Foo" timeToLiveSeconds="300" maxElementsInMemory="1000" eternal="false"/>

jpaPropertyMap属性

<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="javax.persistence.sharedCache.mode">DISABLE_SELECTIVE</prop> 
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
<prop key="hibernate.cache.provider_configuration_file_resource_path">META-INF/com/blah/blah/ehcache.xml</prop>

1 个答案:

答案 0 :(得分:0)

这似乎是this forum主题中讨论的错误,并且根据Jira

,相应的故障单已关闭缺少测试用例

所以这是一个仍然存在的错误。解决方法可能是将UpdateTimestampsCache类扩展为覆盖isUpToDate方法。我可能会尽快尝试并发布更新。

更新:我使用的Hibernate版本是3.5.2(我同意它的旧版本)。此版本不允许根据this主题插入自定义UpdateTimestampsCache。截至目前,由于应用程序的影响,我没有计划升级到最新的hibernate版本。