title: performance issue on Spring Data Mongodb
body: <p>I've got an issue on spring data mongodb, in a method, I request a simple "find" wich retrieve ~1000 Documents.</p>
  
  <p>my spring data code is here :</p>
  
  <pre><code>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);
  </code></pre>
  
  <p>And with JProfiler, i've got <strong>~1,4sec</strong> in the "find" method of MongoTemplate class.
  Note : The request to MongoDB is not the problem, execution take less than 20ms.
  <a href="https://i.stack.imgur.com/wo9vB.png" rel="noreferrer"><img src="https://i.stack.imgur.com/wo9vB.png" alt="enter image description here"></a></p>
  
  <p>But if try to request the same query with mongo java driver by traditional way :</p>
  
  <pre><code>final DBCollection collection = template.getCollection(Constantes.MONGO_COLLECTION_MESSAGES_PARAMETRES_VITAUX);
   final DBCursor cursor = collection.find(myquery.getQueryObject());
  final List&lt;MessageMongo&gt; tab = new ArrayList&lt;&gt;();
   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;
  </code></pre>
  
  <p>My method execute in ~140ms (<strong>10x faster</strong> than mongoTemplate style !)
  <a href="https://i.stack.imgur.com/KclyX.png" rel="noreferrer"><img src="https://i.stack.imgur.com/KclyX.png" alt="enter image description here"></a>
  is there a bug in Spring Data Mongo, or I missed something to configure ?
  I prefer to write with, it is easier to read, but performance is so poor :'(</p>
  
  <p>the Document class :</p>
  
  <pre><code>@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;
  . . .
  </code></pre>
  
  <p>EDIT : <strong>1,67sec</strong> if I use MongoRepository with the named method : </p>
  
  <pre><code>public List&lt;MessageMongo&gt; findByIppAndCodeMesureInAndDateMesureBetween(final String ipp, final List&lt;String&gt; codesMesure, final Instant from, final Instant to);
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/YlzdT.png" rel="noreferrer"><img src="https://i.stack.imgur.com/YlzdT.png" alt="enter image description here"></a></p>
  
  <p>EDIT2:
  logs of spring data :</p>
  
  <pre><code>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
  </code></pre>
  
  <p>EDIT 3 : 
  I've expand the call Tree with org.springframework in full view in JProfiler, so I can view what's wrong with Spring Data MongoDB,
  and here is the majority of time spended :
  <a href="https://i.stack.imgur.com/31sHi.png" rel="noreferrer"><img src="https://i.stack.imgur.com/31sHi.png" alt="enter image description here"></a>
  <strong>2,5 sec total</strong> with</p>
  
  <ul>
  <li><p>1,290 calls of<br>
  org.springframework.data.convert.DefaultTypeMapper.readType (1,462<br>
  ms)</p></li>
  <li><p>1,290 calls of
  org.springframework.data.mongodb.core.convert.MappingMongoConverter.read
  (1,026 ms)</p></li>
  </ul>
  
  <p>And what's the composition of two methods : 
  A majority of Class.forName (erk !) in the first readType
  <a href="https://i.stack.imgur.com/YqcuV.png" rel="noreferrer"><img src="https://i.stack.imgur.com/YqcuV.png" alt="enter image description here"></a></p>
  
  <p>And it's less clear on the second call to MappingMongoConverter.read
  <a href="https://i.stack.imgur.com/53rQR.png" rel="noreferrer"><img src="https://i.stack.imgur.com/53rQR.png" alt="enter image description here"></a></p>
  
  <p>I hope it will be easier to find the issue.</p>