我在spring数据mongodb上遇到了一个问题,在一个方法中,我请求一个简单的“查找”,它可以检索~1000个文档。
我的春季数据代码在这里:
let reachabilityManager = NetworkReachabilityManager()
reachabilityManager?.startListening()
reachabilityManager?.listener = { _ in
if let isNetworkReachable = self.reachabilityManager?.isReachable,
isNetworkReachable == true {
//Internet Available
} else {
//Internet Not Available"
}
}
使用JProfiler,我在MongoTemplate类的“find”方法中得到了 ~1,4sec 。 注意:对MongoDB的请求不是问题,执行时间不到20ms。
但是如果尝试通过传统方式使用mongo java驱动程序请求相同的查询:
$form->get('Formfield')->setValue(some variable);
我的方法在~140ms内执行(比mongoTemplate样式快10倍!) 是否有Spring Data Mongo中的错误,或者我错过了配置的内容? 我更喜欢写,更容易阅读,但表现很差:'(
Document类:
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);
编辑: 1,67秒如果我将MongoRepository与命名方法一起使用:
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;
EDIT2: 春季数据日志:
@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;
. . .
编辑3: 我在JProfiler中使用org.springframework在完整视图中扩展了调用Tree,因此我可以查看Spring Data MongoDB的错误, 以下是大部分时间: 总共2.5秒
来自1,290的电话
org.springframework.data.convert.DefaultTypeMapper.readType(1,462
MS)
1,290个电话 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (1,026毫秒)
两种方法的组成是什么: 第一个readType中的大多数Class.forName(erk!)
第二次调用MappingMongoConverter.read时不太清楚
我希望找到问题会更容易。
答案 0 :(得分:3)
我不确定这是否适用于您的确切情况,但我的情况非常相似,在ClassUtils.forName()
和ClassLoader.load()
浪费了大量时间。
我已经检查了调试器下的情况,在我的情况下,根本原因是我尝试将文档反序列化的类已被移动到另一个包中。在这种情况下,Spring Data无法正确缓存类型信息,并且会发出缓慢而昂贵的ClassLoader.load()
为每个文档保留_class
字段 !
当然,这个类加载注定要失败,因为它引用了存储在文档的_class
字段中的位置不再存在的类。