gpt4 book ai didi

java - Mongodb 读取查询使用 Spring Data 非常慢,而使用 Morphia 则速度很快

转载 作者:可可西里 更新时间:2023-11-01 09:12:14 26 4
gpt4 key购买 nike

我想将我的项目从 Morphia 转换到 Spring Data,但是使用 Spring Data 时一些基本查询非常慢。

例如:

@Override
public List<PTDefaultBlacklistContact> findByBlacklistId(ObjectId defaultBlacklistId, int limit, int offset, String sortBy) {
Query query = Query.query(Criteria.where("blacklistId").is(defaultBlacklistId));

if (limit != 0)
query.limit(limit);

if (offset != 0)
query.skip(offset);

if (StringUtils.hasLength(sortBy))
query.with(new Sort(sortBy));


log.debug("findByBlacklistId query={}", query);
return mongoOperations.find(query, PTDefaultBlacklistContact.class);
}

大约需要 2 分钟

还有吗非亚

@Override
public List<PTDefaultBlacklistContact> findByBlacklistId(ObjectId defaultBlacklistId, int limit, int offset, String sortBy) {
Query<PTDefaultBlacklistContact> q = createQuery().disableValidation().filter("blacklistId", defaultBlacklistId).limit(limit)
.offset(offset);
if (StringUtils.hasLength(sortBy)) {
q.order(sortBy);
}
return q.asList();
}

大约需要 5 秒。

我的配置很基础,所以理解起来很奇怪。我只是在我的 application.yml 中有这个,并且有 spring boot mongodb 自动配置。

spring.data.mongodb.uri: mongodb://serv1,serv2,serv3/${mongodb.database}

有什么想法吗?我想知道原因是否可能是生命周期的事件。

谢谢

编辑:

模型:

PTDefaultBlacklistContact

@Document(collection = "PTDefaultBlacklistContact")
public class PTDefaultBlacklistContact extends PTModel {
private static final long serialVersionUID = 1L;
@Deprecated
@DBRef
protected PTDefaultBlacklist blacklist;
private String identifier;
@Indexed
private ObjectId blacklistId;

private List<PTHistory> history;

public PTDefaultBlacklistContact() {
}

@Override
public int hashCode() {
int prime = 31;
int result = 1;
result = prime * result + ((blacklistId == null) ? 0 : blacklistId.hashCode());
result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
PTDefaultBlacklistContact other = (PTDefaultBlacklistContact) obj;
if (blacklistId == null) {
if (other.blacklistId != null) {
return false;
}
} else if (!blacklistId.equals(other.blacklistId)) {
return false;
}
if (identifier == null) {
if (other.identifier != null) {
return false;
}
} else if (!identifier.equals(other.identifier)) {
return false;
}
return true;
}

@Override
public String toString() {
return "PTDefaultBlacklistContact{" +
"identifier='" + identifier + '\'' +
", blacklistId=" + blacklistId +
'}';
}

public List<PTHistory> getHistory() {
return history;
}

public void setHistory(List<PTHistory> history) {
this.history = history;
}

public String getIdentifier() {
return identifier;
}

public void setIdentifier(String identifier) {
this.identifier = identifier;
}

@Deprecated
public PTDefaultBlacklist getBlacklist() {
return blacklist;
}

@Deprecated
public void setBlacklist(PTDefaultBlacklist blacklist) {
this.blacklist = blacklist;
}

public ObjectId getBlacklistId() {
if (blacklist != null) {
blacklistId = blacklist.getId();
}
return blacklistId;
}

public void setBlacklistId(ObjectId blacklistId) {
this.blacklistId = blacklistId;
}

}

PTH历史

public class PTHistory {

private Long date;
@DBRef
private PTCampaign campaign;

public Long getDate() {
return date;
}

public void setDate(Long date) {
this.date = date;
}

public PTCampaign getCampaign() {
return campaign;
}

public void setCampaign(PTCampaign campaign) {
this.campaign = campaign;
}


}

最佳答案

使用上面的 DBRef 配置,默认情况下,您将使用 Spring Data 急切地解决所有这些问题。这将导致为阅读文档时遇到的每个 DBRef 发出额外的查询。

我们通常建议使用 @DBRef(lazy = true) 来避免这些调用,而是只在它们被访问时才读取它们。

关于java - Mongodb 读取查询使用 Spring Data 非常慢,而使用 Morphia 则速度很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36039295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com