谁使用默认的mongo驱动程序在java / morphia上加载DbRefs

时间:2014-06-03 18:48:33

标签: java performance mongodb morphia

我有以下课程:

@Indexes({@Index("threadOrder,linf"),
    @Index("messageId,linf"),
    @Index("from, date"),
    @Index("linf,date")})
@Entity(noClassnameStored = true)
public class MessageEntry {
    @Id
    public ObjectId id;

    @Reference
    public MailSourceFile mailSourceFile;
    @Reference
    public Email from;
    @Reference
    public Linf linf;

    // some other primitive fields here

}

其中MailSourceFile有一些其他嵌套的@ Reference,电子邮件和Linf没有。问题是即使通过触摸命令将集合加载到存储器中,有时查询也需要很长时间(> 100ms)。我需要这个时间减少,我相信这是可能的。所有的权利都到位了。我有17M MessageEntry文档。慢查询看起来像这样:

ds.createQuery(MessageEntry.class).field("linf").equal(linf)
.field("threadOrder").in(threadOrders).asList();

通常在threadOrders数组中有~15个整数。我的猜测是,缓慢是由嵌套的DBRefs引起的,每次执行此请求时都会产生额外的查询。谁正在加载这些对象:morphia,mongo或java驱动程序?我可以以某种方式避免这些要求吗?可能还有其他事情可以改善此请求的性能吗?感谢名单。

2 个答案:

答案 0 :(得分:1)

Morphia在将文档反序列化回java对象时加载这些引用。默认情况下,它会急切地这样做。您可以通过在lazy=true注释上设置@Reference来告诉morphia进行延迟提取,然后您将获得对象的代理版本,该版本会根据需要懒散地获取这些引用。

答案 1 :(得分:0)

此外,启用慢速查询记录db.setProfilingLevel(1)(请参阅http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/)以查看基础查询是什么,并从那里开始跟踪您的问题。但是,evanchooly的方法肯定会有所帮助。