Wal*_*rat 7 java postgresql hibernate jpa
首先,我将解释我如何理解和使用@BatchSize:
@BatchSize是为了批量加载对象的关系,对数据库产生较少的SQL请求.这对LAZY @OneToMany关系特别有用.
然而,它的上,甚至有用懒 @OneToOne关系和@ManyToOne:如果你从数据库装载实体的名单,并要求加载lazyed @*ToOne实体,它将被批量加载实体,即使我只使用一个测试负载的第一个实体的关系列表.
请注意,如果有人想要测试:这只显示实体是否尚未加载:例如,如果您有一个带有管理员的用户列表并列出所有用户,当您将访问管理员时,不会触发任何请求,因为它已经加载.
我在该方法上看到的唯一缺点是,如果从数据库加载项目列表但仅使用其中的一部分.这是一种后过滤操作.
所以让我们谈谈要点.
让我们假设我做的一切都很好,从不做类似后期过滤的操作,即使它让我做本机SQL查询或使用DTO对象进行多选标准查询等等.
@BatchSize在仔细考虑使用急切加载/加入并最终选择懒惰关系后,我是否可以认为我可以只是每个懒惰的关系?@BatchSize或者我认为"越大越好"?这意味着"在"IN"SQL运算符中是否有任何数量限制可以使我的请求足够慢而不再值得?我使用Postgres但是如果你有其他SGBD的答案我也很感兴趣.@BatchSize在类上使用并不会产生很多结果.我仍然需要注释每一个懒惰的关系,我是否想念它或者它没用?编辑:我的3点是我得到了不同的行为.
假设我正在加载一个类"A"的实体列表,它与B的LAZY OneToMany关系.现在我要打印B的所有creationDate.所以我正在做一个经典的2 for循环.
我现在用BatchSize注释了B:
PS:我没有考虑任何与B相关的查询,可能会通过fetch select/subselect来加载B字段.
编辑2:我刚发现这篇文章为什么我不会在每个延迟加载的关系中使用@BatchSize?虽然我在搜索之前用Google搜索并搜索了我的问题,猜测我没有使用正确的词语......
但是我添加不同的东西,可能会导致不同的答案:当我想了解一下在每个关系中使用BATCHSIZE,它选择后的,如果我想有一个预先加载,以加入/选择提取或如果我想延迟加载.
@BatchSize意味着与懒惰的关联一起使用.@BatchSize在类级别上意味着实体的指定批处理大小将应用于@*ToOne与该实体的所有惰性关联.请参阅文档中的Person实体示例.您提供的链接问题/答案更关注优化和延迟加载的需求.它们当然也适用于此,但它们与批量加载无关,这只是可能的方法之一.
另一个重要的事情涉及到链接答案中提到的急切加载,这表明如果始终使用属性,那么通过使用预先加载可以获得更好的性能.对于集合而言,这通常是不正确的,并且在许多情况下对于一对一的关联也是如此.
例如,假设您使用以下实体,bs并且cs在使用时始终A使用.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Run Code Online (Sandbox Code Playgroud)
如果你不在一个查询中加入它们,那么急切加载bs并且cs显然会遇到N + 1选择问题.但是如果你在一个查询中加入它们,例如:
select a from A
left join fetch a.bs
left join fetch a.cs
Run Code Online (Sandbox Code Playgroud)
然后创建完整的笛卡尔乘积之间bs以及cs和返回count(a.bs) x count(a.cs)的结果集行对每个a被逐个读取并组装成的实体A和他们的收藏bs和cs.
在这种情况下,批量提取将是非常优化的,因为您将首先读取As,然后bs再读取cs,从而导致更多查询,但从数据库传输的数据总量要少得多.此外,单独的查询比具有连接的大查询简单得多,并且数据库更容易执行和优化.
| 归档时间: |
|
| 查看次数: |
5007 次 |
| 最近记录: |