java - Spring Data Mongodb 的性能问题

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

我的spring数据代码在这里:

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);

使用 JProfiler,我在 MongoTemplate 类的“查找”方法中有 ~1,4sec。 注意:对 MongoDB 的请求不是问题,执行时间少于 20 毫秒。

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

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;

我的方法执行时间约为 140 毫秒(比 mongoTemplate 样式快 10 倍!) Spring Data Mongo 中是否存在错误,或者我错过了要配置的内容? 我更喜欢用写,它更容易阅读,但是性能太差了:'(

文档类:

@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;
. . .

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

public List<MessageMongo> findByIppAndCodeMesureInAndDateMesureBetween(final String ipp, final List<String> codesMesure, final Instant from, final Instant to);

编辑2: Spring 数据日志:

2017/12/04 15:44:59,455 INFO  [nio-8180-exec-4] fr.sib.sillage.biometrie.service.impl.MongoMessageService    : findByIppAndCodesBetweenDate ipp=102828799, codes=[147842], dateDebut=2017-12-02T13:46:59,dateFin=2017-12-03T01:46:59  
2017/12/04 15:44:59,482 DEBUG [nio-8180-exec-4] o.s.data.mongodb.repository.query.MongoQueryCreator          : Created query Query: { "ipp" : "102828799", "codeMesure" : { "$in" : [ "147842"]}, "dateMesure" : { "$gt" : { $java : 2017-12-02T12:46:59Z }, "$lt" : { $java : 2017-12-03T00:46:59Z } } }, Fields: null, Sort: null
2017/12/04 15:44:59,517 DEBUG [nio-8180-exec-4] org.springframework.data.mongodb.core.MongoTemplate          : find using query: { "ipp" : "102828799" , "codeMesure" : { "$in" : [ "147842"]} , "dateMesure" : { "$gt" : { "$date" : "2017-12-02T12:46:59.000Z"} , "$lt" : { "$date" : "2017-12-03T00:46:59.000Z"}}} fields: null for class: class fr.sib.sillage.biometrie.model.MessageMongo in collection: parametresVitaux
2017/12/04 15:44:59,517 DEBUG [nio-8180-exec-4] org.springframework.data.mongodb.core.MongoDbUtils           : Getting Mongo Database name=[LilleNoSQLDatabase]
2017/12/04 15:44:59,567 INFO  [nio-8180-exec-4] org.mongodb.driver.connection                                : Opened connection [connectionId{localValue:6, serverValue:3003}] to hades:27017
2017/12/04 15:44:59,567 DEBUG [nio-8180-exec-4] org.mongodb.driver.protocol.command                          : Sending command {find : BsonString{value='parametresVitaux'}} to database LilleNoSQLDatabase on connection [connectionId{localValue:6, serverValue:3003}] to server hades:27017
2017/12/04 15:44:59,592 DEBUG [nio-8180-exec-4] org.mongodb.driver.protocol.command                          : Command execution completed
2017/12/04 15:44:59,796 DEBUG [nio-8180-exec-4] org.mongodb.driver.protocol.command                          : Sending command {getMore : BsonInt64{value=63695089133}} to database LilleNoSQLDatabase on connection [connectionId{localValue:5, serverValue:3004}] to server hades:27017
2017/12/04 15:44:59,862 DEBUG [nio-8180-exec-4] org.mongodb.driver.protocol.command                          : Command execution completed
2017/12/04 15:45:01,213 INFO  [nio-8180-exec-4] fr.sib.sillage.biometrie.service.impl.MongoMessageService    : findByIppAndCodesBetweenDate size=1281

编辑 3: 我在 JProfiler 中用 org.springframework 扩展了调用树,所以我可以查看 Spring Data MongoDB 的问题, 这是花费的大部分时间: 总共 2.5 秒

  • 1,290 个电话
    org.springframework.data.convert.DefaultTypeMapper.readType (1,462
    毫秒)

  • 1,290 次调用 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (1,026 毫秒)

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

第二次调用 MappingMongoConverter.read 时就不太清楚了

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

最佳答案

我不确定这是否适用于您的确切情况,但我遇到了非常相似的情况,在 ClassUtils.forName()ClassLoader.load( )

我已经检查了调试器下的情况,我的根本原因是我试图反序列化文档的类已被移动到不同的包中。在这种情况下,Spring Data 无法正确缓存类型信息,并在 _class 字段对于每个文档!

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

https://stackoverflow.com/questions/47633812/

相关文章:

javascript - 如何将文件名设置为与数据库中的对象 ID 相同?

node.js - mongoose.connection.collections.collecti

node.js - Mongoose 复合索引创建字段顺序

c# - MongoDB 身份验证错误

java - 从 JAVA 应用程序使用 SSL 连接到 MongoDb

node.js - Mongoose(或类似的 ODM)内存记录注册表?

javascript - 如何在 Node 议程中以编程方式定义多个具有相同名称的作业

node.js - 学习 NodeJS 和 MongoDB Docker 组合

linux - 从 bash 提示符和脚本向 docker exec 传递参数

mongodb - 如何为 mongodb 副本集配置 grails 3