gpt4 book ai didi

java - MongoDB - find() 调用有时会卡住 - 超时

转载 作者:行者123 更新时间:2023-11-29 04:45:43 28 4
gpt4 key购买 nike

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

所有将数据放入集合的调用都工作正常,并且是通过通用方法进行的。

所有从集合中获取数据的调用有时都可以正常工作,并且是通过通用方法进行的。

但有时,仅针对其中一个集合我的调用会永远卡住,消耗 CPU 使用率。我必须手动终止线程,否则它会占用我的整个 CPU。

Mongo 连接

MongoClient mongo = new MongoClient(hostName , Integer.valueOf(port));
DB mongoDb = mongo.getDB(dbName);

要获取的代码

DBCollection collection = mongoDb.getCollection(collectionName);
DBObject dbObject = new BasicDBObject("_id" , key);
DBCursor cursor = collection.find(dbObject);

虽然我已经找出它导致问题的集合,但我该如何改进它,因为它有时会发生在这个特定的集合中。

编辑

要保存的代码

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

批量写入/收集

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

我如何设置获取调用的超时...??

最佳答案

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

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 字段上重新创建索引。

关于java - MongoDB - find() 调用有时会卡住 - 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37291667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com