我们使用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);
}
我如何设置呼叫的超时.?
发布于 2016-05-20 10:16:30
别人贴出的答案很棒,但没有解决我的目的。实际上,问题发生在我现有的代码中,我的cursor
正在等待循环无限的时间。
我漏掉了几张支票,现在已经解决了。
发布于 2016-05-18 06:50:54
只是一些可能的解释/想法。
通常,“查询由id”必须是快速的,因为_id应该被索引,总是。代码片段看起来是正确的,所以原因可能是mongo本身。这使我想到了几个建议:
尝试从命令行直接连接到mongo,然后从那里运行"find“。很有可能你仍能观察到偶尔的缓慢。
在这种情况下:
发布于 2016-05-18 06:51:01
另一种方法是对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
字段上重新创建索引。
https://stackoverflow.com/questions/37291667
复制相似问题