简短问题: 当我的实体包含空数组时,为什么通过spring-data MongoTemplate进行的mongodb查询速度较慢?
很长的问题:
我目前正在开发一个在MongoDB数据库支持的Spring 4.0.0 MVC上运行的应用程序。
我的pom.xml的相关部分是:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.4.0.RC1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.7.0.RC1</version>
</dependency>
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
<version>0.9.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
mongo的传递加载的java驱动程序的版本是2.11.4。
现在,我的问题。
我的一个域名实体如下:
@Document
public class Team extends IdentifiableEntity{
private List<String> skills = new ArrayList<>();
private List<String> tools = new ArrayList<>();
private String phone;
private String mail;
// getters, setters, constructors
}
IdentifiableEntity是我所有实体的通用超类:
public abstract class IdentifiableEntity {
@Indexed
protected String id;
@Indexed
protected String name;
@CreatedDate
private DateTime createdAt;
@LastModifiedDate
private DateTime lastModified;
// also getters and setters
}
在我的DAO中,我使用MongoTemplate与MongoDB进行交互,使用基本查询。
在我的开发工作站上,我被迫使用旧的2.0.9版本的MongoDB,因为它运行的是旧的Windows XP 32位,我现在别无选择改变它。 Tomcat版本为7.0.41.0,Java版本为1.7.0_45。处理器是一款老式的Celeron G1610,带有3Go的RAM(由于运行netbeans,redmine,jenkins和一堆资源食用工具而大量充电)。 当我在这个工作站上测试我的代码时没有明显的问题。
我最近在运行旧版RHEL 5 unix的演示平台上部署了我的应用程序,但是使用了MongoDB的最新版本(2.4.9)。 Tomcat版本为7.0.52,Java版本为1.7.0_51-b13。一切仍然是32位。服务器是使用Intel Xeon和3Go RAM的一个Core的VM。 并且开始出现问题。当我尝试加载“Team”类的实体时,需要很长时间。大约80秒。一个记录。我添加了很多日志消息,我能够确定我认为的问题所在,它应该在以下几行:
文件:“org / springframework / data / mongodb / core / MongoTemplate.java” 1995年左右:
private class ReadDbObjectCallback<T> implements DbObjectCallback<T> {
private final EntityReader<? super T, DBObject> reader;
private final Class<T> type;
public ReadDbObjectCallback(EntityReader<? super T, DBObject> reader, Class<T> type) {
Assert.notNull(reader);
Assert.notNull(type);
this.reader = reader;
this.type = type;
}
public T doWith(DBObject object) {
if (null != object) {
maybeEmitEvent(new AfterLoadEvent<T>(object, type));
}
1995 >>> T source = reader.read(type, object);
if (null != source) {
maybeEmitEvent(new AfterConvertEvent<T>(object, source));
}
return source;
}
}
问题似乎出现在“reader.read()”方法中。
我继续探索并发现问题只出现在我的两个List属性为空时。如果在这些字段中保存了对象,则我的查询速度非常快。如果其中一个是空的,那么它是超慢的(大约80秒)。
虽然我无法确定,但似乎我的工作站上已存在问题,但不太明智。日志显示在同一点存在一些延迟,但更少(大约150毫秒,这远远超过需要)。
此外,似乎SAME问题出现在其他具有空数组的实体作为属性。
在查找带有空数组的记录时,您是否知道我的查询速度慢的原因?