java - 如何调试获取自定义对象的 hibernate/spring 数据的缓慢性能

标签 java spring hibernate spring-data

所以我一直在努力使用 spring/hibernate 以高性能的方式获取一些数据。

版本:Spring Data 1.11.1.RELEASESpring 4.3.7.RELEASEHibernate 5.2.9.FinalMysql 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/

相关文章:

java - 带有 JPA 存储库的 Spring Boot 静态 where 子句

java - 如何在 hibernate 状态下更新?

java - 具有不包括静态的上下文路径的Spring Boot

hibernate - @Transaction 问题 : TransactionSynchronization. beforeCompletion 抛出异常

java - MS SQL 多线程死锁

java - 使用 for 循环和对象方法在 Java 中为对象数组赋值时遇到问题

java - HashMap 桶中的 IdentityHashCode

java - 使用JAVA生成带有宏的Excel

java - RecyclerView 中的属性动画

java - 在Spring应用程序中使用commonslogging和slf4j有什么区别?