首先,我将解释如何理解和使用@BatchSize
: @BatchSize
是为了批量加载对象的关系,从而减少对数据库的SQL请求。这对
LAZY @OneToMany
关系特别有用。
但是,它在 LAZY
@OneToOne
关系上甚@ManyToOne
至还很有用:如果从数据库中加载实体列表并要求加载懒惰的@*ToOne
实体,即使我只是使用测试来加载第一个实体的关系,它也会按批加载实体名单。
请注意是否有人要测试:仅显示是否尚未加载实体:例如,如果您有一个具有经理的用户列表并列出了所有用户,则当您访问经理时,由于已存在该实体,因此不会触发任何请求已加载。
我在该方法上看到的唯一缺点是,如果从数据库加载项目列表,但仅使用其中的一部分。这是一个后过滤操作。
因此,让我们进入重点。
假设我使一切都变得好起来,即使从未使我执行本机SQL查询或将DTO对象用于多选条件查询等等,也从不进行类似于过滤后的操作。
@BatchSize
在仔细考虑了使用急切的加载/连接并最终选择一个惰性关系之后,我是否可以考虑到每个惰性关系?@BatchSize
或者我可以认为“越大越好”?这意味着“在“ IN” SQL运算符中是否存在数量上的限制,这会使我的请求变得足够慢,以至于不再值得了?我使用Postgres,但如果您对其他SGBD的回答也感兴趣,我也有兴趣。@BatchSize
在类上使用不会产生很多结果。我仍然必须注释每一个懒惰的关系,我是否想念它还是没用?编辑:我3的要点是我得到了不同的行为。
假设我正在加载类“ A”的实体的列表,该类与B具有LAZY OneToMany关系。现在,我要打印B的所有creationDate。因此,我正在执行经典的2
for循环。
我现在用BatchSize注释了B:
PS:我不考虑对B的任何相关查询,而这些查询可能会触发通过读取选择/子选择加载B字段。
编辑2:我才发现这篇文章为什么我不会在每个延迟加载的关系上使用@BatchSize?尽管我在张贴问题之前用Google搜索并搜索了SO,但猜想我没有使用正确的词…
但是我添加了一些不同的东西,可能会导致一个不同的答案:当我想知道在每个关系上使用BatchSize时,是在选择是否要通过加载/选择获取一个渴望的加载,或者是否要进行延迟加载。
@BatchSize
旨在与惰性关联一起使用。@BatchSize
在类级别上,表示实体的指定批处理大小将应用于@*ToOne
与该实体的所有惰性关联。请参阅文档中有关Person
实体的示例。您提供的链接问题/答案通常更关心优化和延迟加载的需求。它们当然也适用于此,但是它们不仅与批量加载有关,这只是可能的方法之一。
另一个重要的问题与链接加载中提到的预加载有关,这表明如果始终使用属性,则通过使用预加载可能会获得更好的性能。通常对于收藏夹而言 并非如此
,在许多情况下对于一对一关联也是如此。
例如,假设您具有以下实体,bs
并且cs
在使用时 始终 使用该实体A
。
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
如果您不将它们加入单个查询中,那么渴望加载bs
并且cs
显然会遭受N + 1选择问题。但是,如果您将它们加入单个查询中,例如:
select a from A
left join fetch a.bs
left join fetch a.cs
然后创建 完整的笛卡尔乘积 之间bs
以及cs
和返回count(a.bs) x count(a.cs)
结果集行
对每个a
被逐个读取并组装成的实体A
和他们的收藏bs
和cs
。
批量抓取是非常优化在这种情况下,因为你会先看A
S,然后bs
,然后cs
,导致更多的查询,但与从数据库转移总量少得多的数据量。而且,单独的查询比带有连接的大型查询要简单得多,并且数据库更易于执行和优化。
我是C的新手,目前我正在尝试编写一个Brainfuck解释器。到目前为止,我已经尝试过了。 它只在没有循环(“[”和“]”)的情况下工作。当我尝试时: 它给我输出 预期产出:
问题内容: 这个FileInputStream.available()javadoc说: 返回可以从此输入流读取(或跳过)而不会被该输入流的方法的下一次调用阻塞的剩余字节数的估计值。下一个调用可能是同一线程或另一个线程。仅读取或跳过此多个字节不会阻塞,但可能会读取或跳过较少的字节。 在某些情况下,非阻塞读取(或跳过)可能仅在速度较慢时(例如,在速度较慢的网络上读取大文件时)就被阻塞。 我不确定是否
有人能帮助我为什么过渡没有得到应用吗? HTML 萨斯 我在这里有一个工作代码:https://codepen.io/loganlee/pen/rwnjpdz?editors=1100 我希望.box__faces-front和.box__faces-back的rotateY转换都要转换,并且我将转换放在父元素上,在本例中是.box__faces。 多谢了。
问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:
问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:
问题内容: 对于我开发的某些应用程序(后来逐渐忘记了),我一直在编写纯SQL,主要是针对MySQL。尽管我在SQLAlchemy之类的python中使用过ORM,但是我并没有坚持很长时间。通常,这是文档或复杂性(从我的角度来看)使我退缩。 我这样看:如果要使用一种类型的数据库,则使用ORM进行可移植性,使用普通SQL。我真的在寻求有关在开发需要数据库支持的应用程序时何时使用ORM或SQL的建议。