Spring Data Mongodb上的性能问题

时间:2017-12-04 12:50:01

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

我在spring数据mongodb上遇到了一个问题,在一个方法中,我请求一个简单的“查找”,它可以检索~1000个文档。

我的春季数据代码在这里:

let reachabilityManager = NetworkReachabilityManager()

reachabilityManager?.startListening()
reachabilityManager?.listener = { _ in
        if let isNetworkReachable = self.reachabilityManager?.isReachable,
            isNetworkReachable == true {
            //Internet Available
        } else {
            //Internet Not Available"
        }
    }

使用JProfiler,我在MongoTemplate类的“find”方法中得到了 ~1,4sec 。 注意:对MongoDB的请求不是问题,执行时间不到20ms。 enter image description here

但是如果尝试通过传统方式使用mongo java驱动程序请求相同的查询:

$form->get('Formfield')->setValue(some variable);

我的方法在~140ms内执行(比mongoTemplate样式快10倍!) enter image description here 是否有Spring Data Mongo中的错误,或者我错过了配置的内容? 我更喜欢写,更容易阅读,但表现很差:'(

Document类:

Query myquery = query(where("ipp").is(ipp).and(CODE_MESURE).in(codes).and(DATE_MESURE).gte(iDateDebut).lt(iDateFin));
return template.find(myquery, MessageMongo.class);

编辑: 1,67秒如果我将MongoRepository与命名方法一起使用:

final DBCollection collection = template.getCollection(Constantes.MONGO_COLLECTION_MESSAGES_PARAMETRES_VITAUX);
 final DBCursor cursor = collection.find(myquery.getQueryObject());
final List<MessageMongo> tab = new ArrayList<>();
 while (cursor.hasNext()) {
  final DBObject d = cursor.next();
  tab.add(new MessageMongo((String) d.get("origine"), (String) d.get("appareil"),
      (String) d.get("chambre"), (String) d.get("lit"), (String) d.get("uf"), (String) d.get("ipp"),
      (String) d.get("domaineIpp"), (String) d.get("iep"), (String) d.get("domaineIep"), (String) d.get("ej"),
      ((Date) d.get("dateReception")).toInstant(), (String) d.get("codeMesure"),
      (String) d.get("uniteMesure"), (Double) d.get("valeurMesure"), ((Date) d.get("dateMesure")).toInstant()));
 }
return tab;

enter image description here

EDIT2: 春季数据日志:

@Document(collection = Constantes.MONGO_COLLECTION_MESSAGES_PARAMETRES_VITAUX)
public class MessageMongo implements MessageModel {
  @Id
  private String id;
  private final String origine;
  private final String appareil;
  private final String chambre;
  private final String lit;
  private final String uf;
  @Indexed
  private final String ipp;
  private final String domaineIpp;
  private final String iep;
  private final String domaineIep;
  private final String ej;
  private final Instant dateReception;
  @Indexed
  private final String codeMesure;
  private final String uniteMesure;
  private final Double valeurMesure;
  @Indexed
  private final Instant dateMesure;
. . .

编辑3: 我在JProfiler中使用org.springframework在完整视图中扩展了调用Tree,因此我可以查看Spring Data MongoDB的错误, 以下是大部分时间: enter image description here 总共2.5秒

  • 来自1,290的电话 org.springframework.data.convert.DefaultTypeMapper.readType(1,462
    MS)

  • 1,290个电话 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (1,026毫秒)

两种方法的组成是什么: 第一个readType中的大多数Class.forName(erk!) enter image description here

第二次调用MappingMongoConverter.read时不太清楚 enter image description here

我希望找到问题会更容易。

1 个答案:

答案 0 :(得分:3)

我不确定这是否适用于您的确切情况,但我的情况非常相似,在ClassUtils.forName()ClassLoader.load()浪费了大量时间。

我已经检查了调试器下的情况,在我的情况下,根本原因是我尝试将文档反序列化的类已被移动到另一个包中。在这种情况下,Spring Data无法正确缓存类型信息,并且会发出缓慢而昂贵的ClassLoader.load() 为每个文档保留_class字段

当然,这个类加载注定要失败,因为它引用了存储在文档的_class字段中的位置不再存在的类。