首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB - find()调用有时被卡住-超时

MongoDB - find()调用有时被卡住-超时
EN

Stack Overflow用户
提问于 2016-05-18 06:17:37
回答 3查看 4.2K关注 0票数 1

我们使用MongoDb来保存和获取数据。

将数据放入集合中的所有调用都运行良好,并且通过通用方法。

从集合中获取数据的所有调用有时运行良好,并且都是通过通用方法进行的。

但是有时,只为一个集合,我的电话被永远卡住了,消耗了CPU的使用量。我必须手动关闭线程,否则它会消耗我的整个CPU。

Mongo连接

代码语言:javascript
运行
复制
MongoClient mongo = new MongoClient(hostName , Integer.valueOf(port));
DB mongoDb = mongo.getDB(dbName);

代码获取

代码语言:javascript
运行
复制
DBCollection collection = mongoDb.getCollection(collectionName);
DBObject dbObject = new BasicDBObject("_id" , key);
DBCursor cursor = collection.find(dbObject);

虽然我已经找出了它引起问题的集合,但是我如何改进它,因为它是为这个特定的集合而发生的,有时也是如此。

编辑

保存代码的

代码语言:javascript
运行
复制
DBCollection collection = mongoDb.getCollection(collectionName);
DBObject query = new BasicDBObject("_id" , key);
DBObject update = new BasicDBObject();
update.put("$set" , JSON.parse(value));
collection.update(query , update , true , false);

大容量写入/收集

代码语言:javascript
运行
复制
DB mongoDb = controllerFactory.getMongoDB();
        DBCollection collection = mongoDb.getCollection(collectionName);

        BulkWriteOperation bulkWriteOperation = collection.initializeUnorderedBulkOperation();

        Map<String, Object> dataMap = (Map<String, Object>) JSON.parse(value);

        for (Entry<String, Object> entrySet : dataMap.entrySet()) {
            BulkWriteRequestBuilder bulkWriteRequestBuilder = bulkWriteOperation.find(new BasicDBObject("_id" ,
                    entrySet.getKey()));

            DBObject update = new BasicDBObject();
            update.put("$set" , entrySet.getValue());

            bulkWriteRequestBuilder.upsert().update(update);
        }

我如何设置呼叫的超时.?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-20 10:16:30

别人贴出的答案很棒,但没有解决我的目的。实际上,问题发生在我现有的代码中,我的cursor正在等待循环无限的时间。

我漏掉了几张支票,现在已经解决了。

票数 1
EN

Stack Overflow用户

发布于 2016-05-18 06:50:54

只是一些可能的解释/想法。

通常,“查询由id”必须是快速的,因为_id应该被索引,总是。代码片段看起来是正确的,所以原因可能是mongo本身。这使我想到了几个建议:

尝试从命令行直接连接到mongo,然后从那里运行"find“。很有可能你仍能观察到偶尔的缓慢。

在这种情况下:

  • 也许是关于磁盘的(也许这个特定的服务器部署在缓慢的磁盘上,或者至少与访问磁盘的一些缓慢程度有关)。
  • 也许你有一个切分的配置,而一个碎片比其他的要慢。
  • 也许是偶尔发生的网络问题。如果您在本地运行mongo /在暂存env上运行。用同样的藏品复制吗?
  • 也许(尽管我几乎不相信),查询以次优的方式运行。在这种情况下,您可以使用"explain()“,就像有人已经在这里建议的那样。
  • 如果你碰巧有副本集,请找出什么是读取首选项。谁知道呢,也许你更喜欢从次优服务器获得这个id。
票数 1
EN

Stack Overflow用户

发布于 2016-05-18 06:51:01

另一种方法是对MongoDB 3.2驱动程序使用所建议的方法。请记住,您必须将.jar库更新为最新版本(如果没有)。

代码语言:javascript
运行
复制
public final MongoClient connectToClient(String hostName, String port) {
    try {
        MongoClient client = new MongoClient(hostName, Integer.valueOf(port));
        return client;
    } catch(MongoClientException e) {
        System.err.println("Cannot connect to Client.");
        return null;
    }
}

public final MongoDatabase connectToDB(String databaseName) {
    try {
        MongoDatabase db = client.getDatabase(databaseName);
        return db;
    } catch(Exception e) {
        System.err.println("Error in connecting to database " + databaseName);
        return null;
    }

public final void closeConnection(MongoClient client) {
    client.close();
}

public final void findDoc(MongoDatabase db, String collectionName) {
    MongoCollection<Document> collection = db.getCollection(collectionName);
    try {
        FindIterable<Document> iterable = collection
                .find(new Document("_id", key));
        Document doc = iterable.first();
        //For an Int64 field named 'special_id'
        long specialId = doc.getLong("special_id");
    } catch(MongoException e) {
        System.err.println("Error in retrieving document.");
    } catch(NullPointerException e) {
        System.err.println("Document with _id " + key + " does not exist.");
    }
}

public final void insertToDB(MongoDatabase db, String collectioName) {
    try {
        db.getCollection(collectionName).insertOne(new Document()
            .append("special_id", 5)
            //Append anything
        );
    catch(MongoException e) {
        System.err.println("Error in inserting new document.");
    }
}

public final void updateDoc(MongoDatabase db, String collectionName, long id) {
    MongoCollection<Document> collection = db.getCollection(collectionName);
    try {
        collection.updateOne(new Document("_id", id),
                             new Document("$set", 
                                     new Document("special_id", 
                                             7)));
    catch(MongoException e) {
        System.err.println("Error in updating new document.");
    }
}

public static void main(String[] args) {
    String hostName = "myHost";
    String port = "myPort";
    String databaseName = "myDB";
    String collectionName = "myCollection";
    MongoClient client = connectToClient(hostName, port);
    if(client != null) {
        MongoDatabase db = connectToDB(databaseName);
        if(db != null) {
            findDoc(db, collectionName);
        }
        client.closeConnection();
    }
}

编辑:正如其他人所建议的那样,从命令行检查按其ID查找文档的过程是否也很慢。也许这是你的硬盘出了问题。_id应该是索引的,但是不管是好是坏,在_id字段上重新创建索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37291667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档