2017-12-04 28 views
3

私は春のデータmongodbに問題があります。メソッドでは、〜1000 Documentsを検索する簡単な「find」をリクエストします。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への要求は問題ではなく、実行は20ms未満です。 enter image description here

しかし、伝統的な方法での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; 

私の方法はで実行〜140msの(!mongoTemplateスタイルよりも速い10倍) enter image description here することがありSpring Data Mongoのバグ、あるいは設定するものがありませんでしたか? 私は読みやすいですが、パフォーマンスがとても悪い、と書くことを好む:Documentクラス

( ':

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

EDIT:1,67sec私が命名しMongoRepositoryを使用している場合方法:

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

enter image description here

EDIT2: ログの春データ:

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 

EDIT 3: 私はJProfilerをで完全なビューでorg.springframeworkでコールツリーを展開してきたので、私は春データのMongoDBが悪いの内容を表示することができ、 とここで大部分の時間でありますspended:
org.springframework.data.convert.DefaultTypeMapper.readTypeの

  • 1,290コール(1,462 012と enter image description here2.5秒合計を MS) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (1026ミリ秒の

  • 1290の通話)

そして、二つの方法の組成は何: A最初readType enter image description here

中にClass.forNameの過半数(ERK!)そして、それは をMappingMongoConverter.readするために2回目の呼び出しにはあまり明らかです

私は、この問題を見つけやすくなることを願っています。

+0

MongoRepositoryを試しましたか?この[link](https://spring.io/guides/gs/accessing-data-mongodb/)を参考にして教えてください。 –

+0

こんにちは@SachithDickwella! 私はその _publicリストのような方法 findByIppAndCodeMesureAndDateMesureBetweenOrderByDateMesureAsc(最終文字列のIPP、最後の文字列codeMesure、 最終LOCALDATE dateDebut、最終LOCALDATE dateFin)でそれを試してみました。 _しかし、それは悪いことだ、私は持っています** 1,67sec ** –

+0

単一の実行コンテキスト内で2回の呼び出しを呼び出そうとすると、同じ時間がかかりますか? springframework mongodbログを有効にして、ここに貼り付けることはできますか? –

答えて

0

これがあなたの大文字小文字に当てはまるかどうかはわかりませんが、非常に似た状況で、多くの時間が無駄になります。ClassUtils.forName()ClassLoader.load()です。

私はデバッガの状況を調べましたが、根本的な原因は、ドキュメントを逆シリアル化しようとしていたクラスが別のパッケージに移動されたということでした。この場合、Spring Dataはタイプ情報を正しくキャッシュできず、が に残っています_classフィールド各ドキュメント

もちろん、このクラスのロードは、文書の_classフィールドに格納されている場所に存在しなくなったクラスを参照するため、失敗することになります。

関連する問題