小编Dan*_*gel的帖子

如何使用休眠跟踪结果集大小?

我正在尝试检测和优化Java/Hibernate应用程序中的低效连接.我注意到在某些情况下,由于结果集中如何处理联接的性质,线上数据流的效率非常低.

让我举个例子.假设您有一个如下所示的HQL查询:

select s from Store s
left join fetch s.items i
left join fetch s.employees e
left join fetch s.customers c
where s.id = :id
Run Code Online (Sandbox Code Playgroud)

(暂时忽略这不是一个聪明的查询 - 这只是一个简化的例子).

如果您想象某个商店有1000个商品,10个员工和100个客户,您将获得一个包含1111个实体的Java对象树.这可能会让你误以为从数据库中返回了大约1111行,而实际上结果集有1,000,000行!

所有列的存在使这更糟.如果你想象每个表有5列,你可能会想到你有大约5555个"项目",而结果集中的单元格数(行*列)实际上是20,000,000.

显然,应用程序开发人员有责任了解此问题,而不是以这种方式编写查询.然而,这有时会无意地(并且以不太严格的方式)发生,并且能够检测应用程序以某种方式识别这些情况将是很好的.

但是,我一直无法找到任何方法来计算(在Java/Hibernate应用程序中)原始结果集中的行数或列数.Hibernate拦截器,Hibernate事件和Hibernate统计数据似乎都无法访问这些信息.

有什么建议?提前致谢.

java sql orm hibernate jdbc

10
推荐指数
1
解决办法
1435
查看次数

标签 统计

hibernate ×1

java ×1

jdbc ×1

orm ×1

sql ×1