私は春のデータ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未満です。
しかし、伝統的な方法での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倍) することがあり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);
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と 2.5秒合計を MS) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (1026ミリ秒の
1290の通話)
中にClass.forNameの過半数(ERK!)そして、それは をMappingMongoConverter.readするために2回目の呼び出しにはあまり明らかです
私は、この問題を見つけやすくなることを願っています。
MongoRepositoryを試しましたか?この[link](https://spring.io/guides/gs/accessing-data-mongodb/)を参考にして教えてください。 –
こんにちは@SachithDickwella! 私はその _publicリストのような方法 findByIppAndCodeMesureAndDateMesureBetweenOrderByDateMesureAsc(最終文字列のIPP、最後の文字列codeMesure、 最終LOCALDATE dateDebut、最終LOCALDATE dateFin)でそれを試してみました。 _しかし、それは悪いことだ、私は持っています** 1,67sec ** –
単一の実行コンテキスト内で2回の呼び出しを呼び出そうとすると、同じ時間がかかりますか? springframework mongodbログを有効にして、ここに貼り付けることはできますか? –