我在 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/