【问题标题】:Fast JPA Query but slow mapping to entity快速的 JPA 查询,但映射到实体的速度很慢
【发布时间】:2019-03-10 15:25:50
【问题描述】:

由于在使用 Hibernate JPA 时从 DB 作为实体获取大约 30k 结果的性能问题,我改为尝试编写一个 namedQuery 以更好地控制查询及其运行时。对于这几个实体,我最终得到的几乎是 20 秒,而这 20 秒对于“旧”查询和我自己的 namedQuery 是必需的(在 sql 客户端中执行时不需要一秒钟即可获得结果) ,所以基本上无论我使用namedQuery还是hibernate生成的查询都没有任何区别。

假设 98% 的时间用于将这些结果映射到其对应的实体是否安全?如果是这样,我应该如何加快速度?以下是我自己编写的查询(请注意,我必须明确说明 SELECT 中的所有列)

SELECT exp.ID
  ,exp.CREATEDBY
  ,exp.CREATEDTIME
  ,exp.DELETED
  ,exp.LASTCHANGE
  ,exp.LASTCHANGEBY
  ,exp.STATUS
  ,exp.BRIXFIGURE
  ,exp.GRAMMAGE
  ,exp.INDIVIDUALPACKAGING
  ,exp.MINORDERQUANTITY
  ,exp.PACKAGINGHEIGHT
  ,exp.PACKAGINGLENGTH
  ,exp.PACKAGINGWIDTH
  ,exp.PALETTESIZE
  ,exp.QUANTITY
  ,exp.UNIT
  ,exp.VALIDUNTIL
  ,exp.EXPORTELEMENT_START
  ,exp.EXPORTSTATUS
  ,exp.webServiceResponse
  ,exp.CATEGORYID
  ,exp.COMMENTID
  ,exp.SUPPLIERID
  ,exp.TRANSPORTPACKAGINGID
  ,exp.LocationId
  ,exp.PriceRowId
  ,exp.EXPORTELEMENT_ENDDATE
  ,exp.BASEPRICE
  ,exp.BASEUNIT
  ,exp.BARCODES
  ,exp.EXPIRYDATE
  ,exp.PREORDERPERIOD
  ,exp.EXPORTWEEKID
  ,exp.EXPORT_TENDER_UID
  ,exp.EXPORT_UID
  ,exp.CURRENCY_ID
  ,exp.WEIGHT_PER_BOX
  FROM EXPORTELEMENT AS exp
  JOIN EXPORTELEMENT_LOCATION as exlo ON exlo.EXPORTELEMENTID = exp.ID
  WHERE exlo.LOCATIONID = :locationId
  AND exp.EXPORTELEMENT_ENDDATE <= :endDate
  AND exp.EXPORTELEMENT_START >= :startDate
  AND exp.DELETED = :deleted

【问题讨论】:

    标签: sql performance hibernate jpa


    【解决方案1】:

    编写原始 sql 与让 hibernate/jpa 为您编写并不会提高性能。原因可能是您的对象被映射到映射到其他对象等的其他对象(获取急切而不是懒惰)......所以您可能会拉动整个数据库。您可能认为您的查询是唯一正在执行的查询,但实际上其他映射可能正在创建/执行更多的 sql 查询……在我的情况下,我自己执行映射的 10,000 行需要 100 毫秒,但让 hibernate/jpa 执行映射耗时 10 秒,整整 100 倍。

    提高性能的是自己进行映射。像这样的:

    @Query(nativeQuery = true, value = "your_raw_sql_here")
    List<Object[]> yourNativeQueryMethod();
    

    然后你可以自己映射对象:

    for( Object[] objectArray: results) {
        BigInteger id = (BigInteger) objectArray[0];
        //etc...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2023-03-13
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多