java - 更新 mongo 抛出 ConcurrentModificationException?

标签 java mongodb exception dictionary mongo-java

我找了很多方法来解决这个问题,但是这些方法也无法解决我的问题,所以需要您的帮助来解决这个问题,非常非常感谢!

异常堆栈:

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:977)
at java.util.HashMap$KeyIterator.next(HashMap.java:1012)
at org.bson.BSONEncoder.putIterable(BSONEncoder.java:258)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:198)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:140)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:190)
at org.bson.BSONEncoder.putIterable(BSONEncoder.java:259)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:198)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:140)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:190)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:140)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:86)
at com.mongodb.OutMessage.putObject(OutMessage.java:190)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:341)
at com.mongodb.DBCollection.update(DBCollection.java:150)
at com.autonavi.sns.util.TileCache.updateToMongo(TileCache.java:589)
at com.autonavi.sns.util.TileCache.updatePoint(TileCache.java:349)
at com.autonavi.sns.workflow.function.UpdatePointFunc.updatePoint(UpdatePointFunc.java:82)
at com.autonavi.sns.workflow.function.UpdatePointFunc.doExec(UpdatePointFunc.java:37)
at com.autonavi.sns.workflow.function.SNSFunction.execFunc(SNSFunction.java:42)
at com.autonavi.sns.workflow.function.SNSFunction.execFunc(SNSFunction.java:45)
at com.autonavi.sns.workflow.function.SNSFunction.execFunc(SNSFunction.java:45)
at com.autonavi.sns.workflow.function.SNSFunction.execFunc(SNSFunction.java:45)
at com.autonavi.sns.workflow.function.SNSFunction.execFunc(SNSFunction.java:45)
at com.autonavi.sns.workflow.SNSWorkFlow.startExec(SNSWorkFlow.java:45)
at com.autonavi.sns.workflow.SNSWorkFlow.execute(SNSWorkFlow.java:31)
at com.autonavi.sns.service.SNSThreadHandler.serviceDispacth(SNSThreadHandler.java:79)
at com.autonavi.sns.service.SNSThreadHandler.run(SNSThreadHandler.java:47)
at java.lang.Thread.run(Thread.java:662)

设置更新 key :

BasicDBObject udbo = new BasicDBObject();
udbo.put(ConstantUtil.MONGO_ID_KEY, tileId);

List<BasicDBObject> plist = new ArrayList<BasicDBObject>();
for (PointBasic p : points) {
    BasicDBObject pkey = new BasicDBObject();
    boolean isPhysic = p.isPhysicPoint();
    pkey.put("isphysic", isPhysic);
    pkey.put("x", p.getX());
    pkey.put("y", p.getY());
    pkey.put("picurl", p.getPicUrl());
    pkey.put("area", p.getArea());
    plist.add(pkey);
}

BasicDBObject pdbo = new BasicDBObject();
pdbo.put("$set", new BasicDBObject("point", plist));

return this.updateToMongo(udbo, pdbo, TILE_LAYER);

更新 mongo 的 key :

private boolean updateToMongo(BasicDBObject udbo, BasicDBObject ukey, long layer) {
    boolean flag = false;
    try {
        this.mongo = MongoDatabaseUtil.getInstance();
        this.coll = mongo.getCollection(ConstantUtil.TILE_COLL + layer);
        this.coll.update(udbo, ukey, true, true);
        flag = true;
    } catch (MongoException e) {
        LOG.error("Mongo error : ", e);
    }

    return flag;
}

最佳答案

没有足够的信息来确定,但我怀疑您的应用程序是多线程的,并且其他一些线程正在更新 BasicDBObject 而当前线程正在更新调用updateToMongo

对此没有神奇的解决方案。在保留内存中副本时,您必须阻止其他线程更新该副本。

<小时/>

Yes,my application is multi-threaded,but every thread calling updateToMongo in a new class, then the BasicDBObject will affect updateToMongo method?

我认为对 updateToMongo 的调用发生在不同的类或不同的实例“中”并不相关。问题的发生(我猜测)是因为一个线程正在更新给定的 BasicDBObject 实例,而另一个线程正在尝试保留同一实例。 (理论上,它甚至可能是同一个线程执行此操作......但这种情况有点牵强。)

关于java - 更新 mongo 抛出 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9388198/

相关文章:

mongodb - 将项目推送到数组并在同一请求中删除

java - 自定义异常消息

java - 如何强制类的调用者捕获异常?

Java - 获取当前 JAR 中的文件名列表

java - 如何学习 Java Web 服务

javascript - 在 javascript 中增加日期,以更新 MongoDB

javascript - Node.js/MongoDB/ Mongoose : Buffer Comparison

c# - 使用 LINQ 的 .Cast() 运算符时,显式/隐式转换运算符失败

java - 如何检查目录中是否存在文件名?

java - 一种通用的写入方法,FilterWriter