Java 在同一台机器上的两个jvm中,两个单独的hibernate是否会混淆并使用相同的ehcache文件
我有两个独立的Hibernate实例在同一台物理机器上的两个不同jvm中运行 两个hibernate都使用相同的ehcache.xml设置文件,并且两个hibernate jvm都使用一个公共类,如:Java 在同一台机器上的两个jvm中,两个单独的hibernate是否会混淆并使用相同的ehcache文件,java,hibernate,jpa,hibernate-mapping,ehcache,Java,Hibernate,Jpa,Hibernate Mapping,Ehcache,我有两个独立的Hibernate实例在同一台物理机器上的两个不同jvm中运行 两个hibernate都使用相同的ehcache.xml设置文件,并且两个hibernate jvm都使用一个公共类,如: @Entity class Parent { @OneToMany(mappedBy="parent") @Cache(region = "myCache", usage = CacheConcurrencyStrategy.READ_WRITE) private List<
@Entity
class Parent {
@OneToMany(mappedBy="parent")
@Cache(region = "myCache", usage = CacheConcurrencyStrategy.READ_WRITE)
private List<Children> childrens;
}
现在如果进程A
[0]启动事务
[1] 读取父对象,然后
[2] 读取集合中的所有子对象,从而将子对象放在hibernate的ehcache的mycache区域中,从而使inmemory对象计数为full,并将溢出的子对象保存到磁盘,并将文件保存在myCahce.data中
[3] 然后进程A从集合中删除子对象
[4] 交易完成
另一个进程B在获得事务完成消息后,读取父对象,现在如果我们尝试运行parent.getChildren,我将获得
org.hibernate.ObjectNotFoundException: No row with the given identifier exists[my.package.class.entity#3218]
这意味着进程B hibernate确实从某处获得了子对象标识符值,但当它实际尝试从db加载对象时,却找不到它
理想情况下,它不应该获得标识符值
问题:
这是因为两个hibernate实例都使用相同的myCache.data,并且由于DiskExpireythReadIntervalSeconds=120,文件缓存中的对象直到120秒才会启用脏标志
因此进程B最终从缓存文件加载集合对象的ID,但是当它实际尝试从db加载时,它没有找到行,因此抛出错误
系统详细信息:
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.2.Final</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.2.Final</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.2.Final</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.2.Final</version>