java - Stream.count() 如何处理 Spring 存储库查询?
问题描述
我在 Spring 框架中工作并使用存储库将数据作为流加载。下面是正在使用的代码:
@Query("select j from User j ")
@QueryHints({ @QueryHint(name = HINT_FETCH_SIZE, value = Constants.JPA_QUERYHINT_FETCH_SIZE) })
Stream<User> streamAll();
当我们调用service.getStream().count()
方法时,它是在内存中加载完整的数据集还是有一些关于流大小的元信息?
这里我关心的是内存消耗和性能。
解决方案
自己试试。
如果返回 true,则无需迭代即可获得计数。
如果它返回 false 那么你将不得不迭代。
myRepo.streamAll().spliterator().hasCharacteristics(Spliterator.SIZED)
检查实现有点繁琐,因为Spring 为 repos 创建了一个动态代理。
我想没有什么可说的,即使现在没有这种优化,将来也可能无法使用。可能也取决于数据库供应商,因为并非所有人都有 O(1) 的方式来获取行数(通常通过将其存储为表元数据来完成)。
推荐阅读
- c++ - 如何将 OpenMP 和 MPI 导入大型 CLion CMake 项目?
- snowflake-cloud-data-platform - 如何在 SnowFlake 中加入 query_id 和 METADATA$ROW_ID
- python-3.x - 有什么方法可以找到多个图像的边界并单独裁剪它们?
- r - 从一系列网页中解析图表
- python - 将原始 CFA 缓冲区保存到原始图像
- javascript - 阿波罗客户端在反应原生的初始重新加载中返回未定义
- javascript - 如何使用私有方法正确配置 ES6 类的 eslint?
- c# - 在页面级别实现 Asp.NET core 2.2 Sessionstate 或 tempdata 等效项
- javascript - Ajax errorThrown:内部服务器错误,但状态为 4
- android - 在 kotlin 中旋转 R.drawable