最近,我将MongoDB数据库从Windows迁移到CentOS。版本为2.4.9。我注意到_id字段检索记录的速度很慢!我在周末运行了一个修复数据库,但是没有解决这个问题。我有这样一个方法,它通过它们的IN (使用IN操作符)检索记录(使用spring data mongodb 1.4.1.RELEASE):
@Override
public Map<String, Record> findAsMapIds(
final String[] ids,
final ComponentType... comps
) {
if( null == ids || 0 == ids.length ) {
return null;
}
Map<String,Record> result = new HashMap<String,Record>();
final Criteria cr = where("_id").in( idArrFunction.apply(ids) );
final Query qry = new Query( cr );
setFieldsToReturn( qry, comps );
long start = System.currentTimeMillis();
List<Record> ritems = getTemplate().find(qry, Record.class);
long end = System.currentTimeMillis();
System.out.println( "findAsMapIds()::" + (end-start) );
for( Record r: ritems ) {
result.put( r.getId(), r );
}
return result;
}
public MongoOperations getTemplate() {
return template;
}函数idArrFunction返回一个ObjectId[]数组
您注意到,我只是在计时数据检索调用。而且,我不会一次传递超过10个I。下面是我多次调用此方法时在日志中获得的定时输出:
findAsMapIds()::2092
findAsMapIds()::6666
findAsMapIds()::10007
findAsMapIds()::15132
findAsMapIds()::18341
findAsMapIds()::24709
findAsMapIds()::28731
findAsMapIds()::33888
findAsMapIds()::36862
findAsMapIds()::40206您注意到,随着每次调用此方法,时间都会增加。
以下是收藏统计数据:
> db.record.stats();
{
"ns" : "mydb.record",
"count" : 1491427,
"size" : 18292198304,
"avgObjSize" : 12264.896843090544,
"storageSize" : 18899890096,
"numExtents" : 30,
"nindexes" : 13,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 734401024,
"indexSizes" : {
"_id_" : 43561728,
"orgId" : 63192304,
"type" : 51018240,
"orgHierarchy" : 63274064,
"orgHierarchy_mrn" : 75603472,
"dos" : 25525472,
"org_pdt" : 77189616,
"orgHierarchy_processedDtTm" : 77287728,
"processedDtTm_-1" : 37536016,
"orgId_states" : 68367712,
"states" : 27553120,
"states_1_processedDtTm_-1" : 41624016,
"orgId_1_states_1_processedDtTm_-1" : 82667536
},
"ok" : 1
}如果我从java打印出查询对象,就会得到以下内容:
Query: { "_id" : { "$in" : [ { "$oid" : "51cbe96dcb81c43374ca9516"} , { "$oid" : "51cbe892cb81c43374ca5e48"} , { "$oid" : "51cbe910cb81c43374ca7aba"} , { "$oid" : "51c00739cb81e6b83ad29d14"} , { "$oid" : "51c06ff4cb81e6b83ad4f69a"} , { "$oid" : "51c07010cb81e6b83ad4f74e"} , { "$oid" : "51c06da5cb81e6b83ad4e775"} , { "$oid" : "51c081bbcb81e6b83ad56437"} , { "$oid" : "51c07fe2cb81e6b83ad557d2"} , { "$oid" : "51c081bbcb81e6b83ad56433"}]}}, Fields: { "text" : 1 , "type" : 1 , "header" : 1 , "orgId" : 1 , "vitals" : 1 , "_id" : 1 , "processedDtTm" : 1 , "orgHierarchy" : 1 }, Sort: null此外,如果我运行解释:
> db.record.find({ "_id" : { "$in" : [ ObjectId("51ba0b43cb81e6b83acd9e6b") , ObjectId("51a8feb5cb8168350e373428") , ObjectId("51a90053cb8168350e373948") , ObjectId("51a901fecb8168350e373e82") , ObjectId("51a8f3e9cb8168350e3711d1") , ObjectId("51a8f3eacb8168350e3711d2") , ObjectId("51a8ff3ecb8168350e3735df") , ObjectId("51a8f59ecb8168350e37172b") , ObjectId("51a8f9aacb8168350e372418") , ObjectId("51a8f786cb8168350e371d42")]}}).explain();
{
"cursor" : "BtreeCursor _id_ multi",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 10,
"nscanned" : 18,
"nscannedObjectsAllPlans" : 10,
"nscannedAllPlans" : 18,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"_id" : [
[
ObjectId("51a8f3e9cb8168350e3711d1"),
ObjectId("51a8f3e9cb8168350e3711d1")
],
[
ObjectId("51a8f3eacb8168350e3711d2"),
ObjectId("51a8f3eacb8168350e3711d2")
],
[
ObjectId("51a8f59ecb8168350e37172b"),
ObjectId("51a8f59ecb8168350e37172b")
],
[
ObjectId("51a8f786cb8168350e371d42"),
ObjectId("51a8f786cb8168350e371d42")
],
[
ObjectId("51a8f9aacb8168350e372418"),
ObjectId("51a8f9aacb8168350e372418")
],
[
ObjectId("51a8feb5cb8168350e373428"),
ObjectId("51a8feb5cb8168350e373428")
],
[
ObjectId("51a8ff3ecb8168350e3735df"),
ObjectId("51a8ff3ecb8168350e3735df")
],
[
ObjectId("51a90053cb8168350e373948"),
ObjectId("51a90053cb8168350e373948")
],
[
ObjectId("51a901fecb8168350e373e82"),
ObjectId("51a901fecb8168350e373e82")
],
[
ObjectId("51ba0b43cb81e6b83acd9e6b"),
ObjectId("51ba0b43cb81e6b83acd9e6b")
]
]
},
"server" : "ip-10-0-0-41:27017"
}我打开了侧写器,这就是我得到的
{
"op":"query",
"ns":"sytrue.record",
"query":{
"_id":{
"$in":[
ObjectId("51b1c98dcb81e4c1566b7436"),
ObjectId("51b1cb3ccb81e4c1566b79ab"),
ObjectId("51b1d741cb81e4c1566ba219"),
ObjectId("51b1caa8cb81e4c1566b77d4"),
ObjectId("51b1c98ccb81e4c1566b7433"),
ObjectId("51b1c691cb81e4c1566b6a8c"),
ObjectId("51b1cc21cb81e4c1566b7c9f"),
ObjectId("51b1c390cb81e4c1566b60c9"),
ObjectId("51b1d578cb81e4c1566b9c1d"),
ObjectId("51b1e13dcb81e4c1566bc30e")
]
}
},
"ntoreturn":0,
"ntoskip":0,
"nscanned":19,
"keyUpdates":0,
"numYield":0,
"lockStats":{
"timeLockedMicros":{
"r":NumberLong(380),
"w":NumberLong(0)
},
"timeAcquiringMicros":{
"r":NumberLong(2),
"w":NumberLong(4)
}
},
"nreturned":10,
"responseLength":36745,
"millis":0,
"ts": ISODate("2014-03-24T09:55:20.988 Z"),
"client":"127.0.0.1",
"allUsers":[
{
"user":"sytrue-user",
"userSource":"sytrue"
}
],
"user":"sytrue-user@sytrue"
}更新:我注意到在返回结果时,CPU是由java代码消耗的,而不是mongo服务器进程。因此,问题要么出现在mongodb-java驱动程序中,要么出现在spring-data-mongodb中。
发布于 2014-03-24 18:13:59
发现了与MongoDB开发人员聊天时出现的问题:我正在运行SpringFramework4.0.0,慢度与此问题有关:
https://jira.spring.io/browse/SPR-11335
将Spring更新到4.0.1 (或更高版本)解决了这个问题。
这是从我的调用到问题的堆栈跟踪:
at java.lang.Class.getGenericSignature(Native Method)
at java.lang.Class.getGenericInterfaces(Class.java:813)
at org.springframework.core.SerializableTypeWrapper$2.getType(SerializableTypeWrapper.java:106)
at org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:220)
at com.sun.proxy.$Proxy5.equals(Unknown Source)
at org.springframework.util.ObjectUtils.nullSafeEquals(ObjectUtils.java:252)
at org.springframework.core.ResolvableType.equals(ResolvableType.java:682)
at org.springframework.util.ObjectUtils.nullSafeEquals(ObjectUtils.java:252)
at org.springframework.core.ResolvableType.variableResolverSourceEquals(ResolvableType.java:719)
at org.springframework.core.ResolvableType.equals(ResolvableType.java:683)
at org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(ConcurrentReferenceHashMap.java:571)
at org.springframework.util.ConcurrentReferenceHashMap$Segment.getReference(ConcurrentReferenceHashMap.java:439)
at org.springframework.util.ConcurrentReferenceHashMap.getReference(ConcurrentReferenceHashMap.java:238)
at org.springframework.util.ConcurrentReferenceHashMap.get(ConcurrentReferenceHashMap.java:217)
at org.springframework.core.ResolvableType.forType(ResolvableType.java:1018)
at org.springframework.core.ResolvableType.forType(ResolvableType.java:998)
at org.springframework.core.ResolvableType.getGenerics(ResolvableType.java:489)
at org.springframework.core.ResolvableType.getGeneric(ResolvableType.java:451)
at org.springframework.core.convert.TypeDescriptor.getElementTypeDescriptor(TypeDescriptor.java:305)
at org.springframework.core.convert.TypeDescriptor.equals(TypeDescriptor.java:456)
at org.springframework.util.ObjectUtils.nullSafeEquals(ObjectUtils.java:252)
at org.springframework.core.convert.support.GenericConversionService$ConverterCacheKey.equals(GenericConversionService.java:436)
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:996)
at org.springframework.core.convert.support.GenericConversionService.getConverter(GenericConversionService.java:235)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:176)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:162)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getPotentiallyConvertedSimpleRead(MappingMongoConverter.java:715)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readCollectionOrArray(MappingMongoConverter.java:773)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1048)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$100(MappingMongoConverter.java:77)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:999)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:755)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:256)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:249)
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:261)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:249)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:223)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:187)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:183)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:77)
at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1966)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1662)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1487)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1471)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:527)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:518)
at com.sytrue.record.persistence.repo.impl.RecordRepositoryImpl.findAsMapIds(RecordRepositoryImpl.java:139)https://stackoverflow.com/questions/22603694
复制相似问题