MongoTemplate, długie wyszukiwanie

0

Korzystamy z MongoDB i org.springframework.data.mongodb.core.MongoTemplate;do tworzenia zapytań do tej bazy. Od jakiegoś czasu zgłaszano nam z produkcji, że wyszukiwarka wolno działa, sprawdziłem na środowisku dev gdzie mam w sumie około 700 dokumentów w bazie - to samo. Sama encja którą wyszukuję wygląda mniej więcej tak

public class Document {
	private String id;
	private SubDocumentOne one;
	private SubDocumentTwo two;
}

public class SubDocumentOne {
	private DateTime date;
	private String type;
	private String xmlContent;
        private List<BusinessData> businessData;
}

public class BusinessData {
       private String key;
       private String value;

W sumie w każdym z dokumentów jest 5-10 pól.

Query wygląda tak

Query query = new Query((Criteria.where("subdocumentone.type").is("someType")));
result = mongoTemplate.find(query, Document.class);

Z tego co widziałem to do mongo leci

{ "subdocumentone.type" : { "$eq" : "someType" }

Wynikiem jest ok 600 dokumentów. Zapytanie trwa około 15 sekund. Z tym, że samo query na mongo wykonuje się <5ms. Resztę czasu prawdopodobnie trwa konwertowanie tej odpowiedzi do obiektów Javowych. Pytanie więc, jak to przyśpieszyć? Jest inne rozwiązanie niż wprowadzenie pageowania?

1

Zamiast zgadywać odpal profiler i zobacz co faktycznie zabiera czas.

0

Resztę czasu prawdopodobnie trwa konwertowanie tej odpowiedzi do obiektów Javowych.

A sprawdzałeś to? https://visualvm.github.io/startupprofiler.html

0

Odpaliłem profilera jak radziliście. Widać po nim to co już wiedziałem, 10 sekund na wykonanie metody find w mongoTemplate.
W załączniku wynik profilera.

Coś jeszcze mogę sprawdzić z profilerem? Jakieś pomysły czemu to tyle trwa? Przypomnę że mowa o środowisku dev gdzie 10 sekund zajęło zwrócenie <700 rekordów.

0

Odpal to zapytanie z konsoli mongo i zobacz ile trwa.

0

Z tym, że samo query na mongo wykonuje się <5ms.

Tak jak pisałem, to samo query odpalone bezpośrednio w shellu wykonuje się <5 ms.
Odpalałem też profilera na bazie i przechwytywałem strzały ze swojej aplikacji - to samo, czyli <5 ms.

edit#
dokopałem się głębiej w profilerze, praktycznie cały czas zabiera InputStream.read

1 użytkowników online, w tym zalogowanych: 0, gości: 1