转换空数组的Spring Data mongodb可能很慢

时间:2014-03-31 09:20:55

标签: java spring mongodb spring-data spring-data-mongodb

简短问题: 当我的实体包含空数组时,为什么通过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问题出现在其他具有空数组的实体作为属性。

在查找带有空数组的记录时,您是否知道我的查询速度慢的原因?

0 个答案:

没有答案