gpt4 book ai didi

java - ActiveJDBC 多态父级的热切加载

转载 作者:行者123 更新时间:2023-12-01 09:34:49 25 4
gpt4 key购买 nike

我无法急切地加载子类的多态父类。 include 语句似乎没有什么区别。

子类:

@BelongsToPolymorphic(
parents = {ParentRequest.class},
typeLabels = {"parent_request"})
public class Child extends Model {
}

父类:

public class ParentRequest extends Model {

}

应该急切返回子+父的查询:

List<Child> children = Child.where("... limit 500").include(ParentRequest.class);

children.size(); //this gives me 500
children.cachedParents.size(); //this gives me 0;

最终,我试图加快以下操作:

for (Child child : children) {
ParentRequest pr = child.parent();
// lots of pr.getString("parent_field");
...
}

我已经对这些操作进行了测试,无论是否在 Child.where() 方法上使用 .include(ParentRequest.class) ,上述操作似乎都需要大约 67 毫秒。

非常感谢任何见解或帮助。

注意:我知道 child 只有一个 parent 。在不久的将来,它将会有几个。

编辑: 由于某些原因,反转查询会产生更快的结果。也就是说,如果我搜索 ParentRequest 并包含 Child,而不是寻找 Children 并包含 ParentRequest,则操作会快得多。请注意,我专门执行了 findBySql 将子表连接到结果中的parent_request 表。下面我留下了查询的细节。

List<ParentRequest> parents = ParentRequest.findBySQL("SELECT child.*, parent_requests.* " +
"FROM child JOIN parent_requests ON child.parent_id=parent_requests.id WHERE " +
"RAND()<=? AND (child.metersToA BETWEEN ? AND ?) " +
" AND (child.metersToB BETWEEN ? AND ?) limit ?",
decimation_value,
minDistanceToA, maxDistanceToA ,
minDistanceToB, maxDistanceToB,
MAX_POINTS).include(Child.class);

最佳答案

我编写了一个简单的测试并启用了日志记录:

Article article = Article.findById(1);
article.add(Comment.create("author", "tjefferson", "content", "comment 1"));
article.add(Comment.create("author", "tjefferson", "content", "comment 2"));
LazyList<Comment> comments = Comment.where("author = ?", "tjefferson").include(Article.class);

System.out.println(comments.size());// does loading of data, prints 2
Article parent1 = comments.get(0).parent(Article.class); // does not generate DB query
Article parent2 = comments.get(1).parent(Article.class); // does not generate DB query

assert (parent1 == parent2); // true

执行此代码会将以下内容记录到控制台:

SELECT * FROM comments WHERE author = ?", with parameters: <tjefferson>, took: 1 milliseconds
SELECT * FROM articles WHERE id IN (?)", with parameters: <1>, took: 1 milliseconds

正如您所看到的,只有两个对数据库的查询。此外,您提到的行:

children.cachedParents.size(); //this gives me 0;

将无法编译,因为LazyList没有成员cachedParents

如果在这种情况下循环遍历子级,并得到像这样的父级:

child.parent(Parent.class)

,不会有对数据库的数据库查询,因为对象缓存在内存中。

该框架正在按预期运行。使用和不使用 include() 的时间相同的原因是数据集的大小。 67 毫秒相当快,“瓶颈”在其他地方。

要看到差异,您需要加载更大的数据集。

此外,请记住,加载的数据越多,分配的堆空间就越多。最终 include() 方法解决了 N+1 问题 ( http://javalite.io/lazy_and_eager ),但这并不意味着您的应用程序会更快。您需要进行试验,并决定是否最好在您的情况下使用它。

摘要:如果您使用 include() 方法,您将减少对数据库的调用,但会分配更多的 RAM。您可以决定它是否对您的应用来说更快。

关于java - ActiveJDBC 多态父级的热切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39092007/

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