Java 如何修复争用条件,创建重复类错误
启动tomcat服务器时,出现以下错误: 2015年10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance 严重:竞争条件,创建了重复类:class com.calendar.model.watchers.AccountWatcher 据我所知,它来自于Morphia,但我不确定它为什么会发生或如何修复 Morphia中出现错误的代码如下:Java 如何修复争用条件,创建重复类错误,java,multithreading,mongodb,tomcat,morphia,Java,Multithreading,Mongodb,Tomcat,Morphia,启动tomcat服务器时,出现以下错误: 2015年10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance 严重:竞争条件,创建了重复类:class com.calendar.model.watchers.AccountWatcher 据我所知,它来自于Morphia,但我不确定它为什么会发生或如何修复 Morphia中出现错误的代码如下: private Object getOrCreateInstance
private Object getOrCreateInstance(Class<?> clazz) {
if (mapr.instanceCache.containsKey(clazz))
return mapr.instanceCache.get(clazz);
Object o = mapr.getOptions().objectFactory.createInstance(clazz);
Object nullO = mapr.instanceCache.put(clazz, o);
if (nullO != null)
if(log.isErrorEnabled())
log.error("Race-condition, created duplicate class: " + clazz);
return o;
}
Account类别的代码为:
package com.calendar.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize.Typing;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.EntityListeners;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Indexed;
import org.mongodb.morphia.annotations.Reference;
import com.calendar.model.serializers.PartnerDeSerializer;
import com.calendar.model.serializers.PartnerListSerializer;
import com.calendar.model.serializers.PartnerSerializer;
import com.calendar.model.watchers.AccountWatcher;
@ToString
@EntityListeners(AccountWatcher.class)
@Entity("accounts")
@Data
public class Account {
@Id
private String id;
private String name;
private String timezone;
@JsonSerialize(using = PartnerSerializer.class, typing = Typing.STATIC)
@JsonDeserialize(using = PartnerDeSerializer.class)
@Reference
private Partner owner;
@JsonSerialize(using = PartnerListSerializer.class, typing = Typing.STATIC)
@Reference
private List<Partner> associatedPartners;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private Date dateCreated;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private Date dateModified;
@Indexed(unique = true, dropDups = true)
private String externalId;
private Integer externalVersionNumber;
private List<EList> elists;
public Account() {
associatedPartners = new ArrayList<Partner>();
}
}
package com.calendar.model;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入龙目数据;
进口龙目草;
导入com.fasterxml.jackson.annotation.JsonFormat;
导入com.fasterxml.jackson.annotation.JsonFormat.Shape;
导入com.fasterxml.jackson.databind.annotation.JsonDeserialize;
导入com.fasterxml.jackson.databind.annotation.JsonSerialize;
导入com.fasterxml.jackson.databind.annotation.JsonSerialize.Typing;
导入org.mongodb.morphia.annotations.Entity;
导入org.mongodb.morphia.annotations.EntityListeners;
导入org.mongodb.morphia.annotations.Id;
导入org.mongodb.morphia.annotations.index;
导入org.mongodb.morphia.annotations.Reference;
导入com.calendar.model.serializer.PartnerDeSerializer;
导入com.calendar.model.serializer.PartnerListSerializer;
导入com.calendar.model.serializer.PartnerSerializer;
导入com.calendar.model.watchers.AccountWatcher;
@托斯特林
@EntityListeners(AccountWatcher.class)
@实体(“账户”)
@资料
公共类帐户{
@身份证
私有字符串id;
私有字符串名称;
专用字符串时区;
@JsonSerialize(使用=PartnerSerializer.class,typing=typing.STATIC)
@JsonDeserialize(使用=PartnerDeSerializer.class)
@参考文献
私人合伙人所有者;
@JsonSerialize(使用=PartnerListSerializer.class,typing=typing.STATIC)
@参考文献
私人合作伙伴名单;
@JsonFormat(shape=shape.STRING,pattern=“yyyy-MM-dd'T'HH:MM:ssZ”)
创建私人日期;
@JsonFormat(shape=shape.STRING,pattern=“yyyy-MM-dd'T'HH:MM:ssZ”)
修改私人日期;
@索引(unique=true,dropDups=true)
私有字符串外部化;
私有整数externalVersionNumber;
私人名单;
公共帐户(){
associatedPartners=new ArrayList();
}
}
提前感谢您提供的任何帮助。啊,我明白了。我不确定为什么决定将其记录为错误(相反,为什么该逻辑不同步),但这只是一条记录消息。当然,这不是一个真正的问题,除非您的侦听器是可变的,并且有两个实例是一个实际问题。实际的stacktrace会有所帮助。您可以使用。它应该检测所有的数据竞争。@Evancholy没有出现此错误的stackrace。错误来自morphia,它所做的只是记录错误和它遇到问题的类。我将更新我的原始问题,以包含Morphia记录错误的代码。多谢托马斯,我会仔细研究一下。听者是由Morphia预先定义的,我没有做任何改变。据我所知,类本身没有以任何方式被更改,因此它看起来不可变,尽管它为每个实例创建了记录器。这看起来很奇怪,除非监听器默认是可变的,否则它可以记录错误,但也完全有可能这实际上不是问题,Morphia只是在跨越它的T并点它的I。你的建议是可以忽略这一点吗?还是需要更多的研究/信息?您可能可以忽略此错误,因为AccountWatcher是无状态的。
package com.calendar.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize.Typing;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.EntityListeners;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Indexed;
import org.mongodb.morphia.annotations.Reference;
import com.calendar.model.serializers.PartnerDeSerializer;
import com.calendar.model.serializers.PartnerListSerializer;
import com.calendar.model.serializers.PartnerSerializer;
import com.calendar.model.watchers.AccountWatcher;
@ToString
@EntityListeners(AccountWatcher.class)
@Entity("accounts")
@Data
public class Account {
@Id
private String id;
private String name;
private String timezone;
@JsonSerialize(using = PartnerSerializer.class, typing = Typing.STATIC)
@JsonDeserialize(using = PartnerDeSerializer.class)
@Reference
private Partner owner;
@JsonSerialize(using = PartnerListSerializer.class, typing = Typing.STATIC)
@Reference
private List<Partner> associatedPartners;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private Date dateCreated;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private Date dateModified;
@Indexed(unique = true, dropDups = true)
private String externalId;
private Integer externalVersionNumber;
private List<EList> elists;
public Account() {
associatedPartners = new ArrayList<Partner>();
}
}