Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复争用条件,创建重复类错误_Java_Multithreading_Mongodb_Tomcat_Morphia - Fatal编程技术网

Java 如何修复争用条件,创建重复类错误

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

启动tomcat服务器时,出现以下错误: 2015年10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance 严重:竞争条件,创建了重复类:class com.calendar.model.watchers.AccountWatcher

据我所知,它来自于Morphia,但我不确定它为什么会发生或如何修复

Morphia中出现错误的代码如下:

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>();
  }
}