所以我一直在努力使用 spring/hibernate 以高性能的方式获取一些数据。
版本:Spring Data 1.11.1.RELEASE
,Spring 4.3.7.RELEASE
,Hibernate 5.2.9.Final
,Mysql Conn 5.1.41
我有一个非常基本的查询
select ps.size*ps.pack, ps.uom, p.description, p.itemCode, ps.id as packSizeId, p.id as productId from PackSize ps
join product p on ps.product_id = p.id
where p.description like ?1
此查询大约需要 150 毫秒才能运行,它通常会返回大约 50-300 个结果,但会略有不同,但这些都是相当不错的一般数字。
我看到的问题是将其处理成实际记录大约需要 1 整秒。
所以现在我的代码看起来像这样。我试过通过 JPQL 查询直接创建 MinimalPackSize,我也试过直接获取真实的域实体而不手动制作它。在所有情况下,我看到的性能基本相同。处理结果所花的时间通常是查询所花时间的 8-10 倍。鉴于它返回的记录相当少,这没有意义为什么它会那么慢。
Collection<Object[]> items = internalProductRepository.findMinimalByDescriptionLike("%" + trimmed + "%");
for (Object[] item : items) {
BigDecimal totalUnits = (BigDecimal) item[0];
UnitOfMeasureEnum uom = UnitOfMeasureEnum.valueOf(item[1].toString());
String desc = item[2].toString();
String itemCode = item[3].toString();
Long psId = ((BigInteger) item[4]).longValue();
Long pId= ((BigInteger) item[5]).longValue();
products.add(new MinimalPackSize(totalUnits, uom, desc, itemCode, psId, pId));
}
@Query(value = "select ps.size*ps.pack, ps.uom, p.description, p.itemCode, ps.id as packSizeId, p.id as productId from PackSize ps " +
"join product p on ps.product_id = p.id " +
"where p.description like ?1", nativeQuery = true)
Collection<Object[]> findMinimalByDescriptionLike(String withDesc);
我已经启用了调试,但没有什么特别突出的问题。我确实验证了 internalProductRepository.findMinimalByDescriptionLike("%"+ trimmed + "%");
实际上很慢。因此,无论我如何获得结果,它似乎都在 hibernate/ Spring 。
这是在一台速度很快的机器上,我似乎没有任何其他主要的性能问题。
关于为什么处理几个结果需要这么长时间有什么想法吗?
最佳答案
您需要有一个基准(例如,找出 1 条记录,您的代码需要 1 毫秒来处理。因此,对于 400 条记录,它不应超过 400 毫秒)。如果您看到任何退化,这将有助于确定谁是罪魁祸首。
是的,你需要考虑 -
- 通过Jdbc驱动将数据读入java对象的时间
- 在内存中创建对象的时间
关于java - 如何调试获取自定义对象的 hibernate/spring 数据的缓慢性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810604/