java batch_java – @BatchSize使用聪明还是愚蠢?

首先,我将解释我如何理解和使用@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:

> @OneToMany未使用BatchSize进行批注:每个迭代都会独立加载每组B而不进行批处理.所以我对B类的注释似乎完全被忽略了.即使我将值设置为“2”并且我在一组中有6个条目,我也有一个查询.

> @OneToMany已注释:我具有已加载批次的特定查询.如果我将批量大小固定为2并且我总共有10个B accros我只得到5个请求:无论A的数量是多少.如果我将其设置为100:我有一个B对象的查询.

PS:我没有考虑任何与B相关的查询,可能会通过fetch select / subselect来加载B字段.

然而,我正在添加一些不同的东西,可能会导致不同的答案:当我想知道在每个关系上使用BatchSize时,它是在选择我是否想要一个急切的加载,加入/选择获取或如果我想要延迟加载.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值