Changeset 8131


Ignore:
Timestamp:
Mar 21, 2023, 11:58:37 AM (3 months ago)
Author:
Nicklas Nordborg
Message:

References #2296: Improve performance when loading many any-to-any links

The DataQuery class uses the stateless Hibernate session which is causing a lot of extra queries while iterating (since the statless session doesn't support lazy proxies). Switched to AbstractEntityQuery instead which allows us to use the stateful session.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.19-stable/src/core/net/sf/basedb/core/AnyToAny.java

    r8130 r8131  
    814814      // We store the mapping between source item id and target item id
    815815      Map<Integer, Integer> idMap = new HashMap<>();
    816       DataQuery<AnyToAnyData> linkQuery = new DataQuery<>(AnyToAnyData.class, null);
     816      AbstractEntityQuery linkQuery = new AbstractEntityQuery(Item.ANYTOANY, null, false)
     817      {};
    817818      linkQuery.restrict(Restrictions.eq(Hql.property("fromType"), Expressions.integer(fromType.getValue())));
    818819      linkQuery.restrict(Restrictions.eq(Hql.property("toType"), Expressions.integer(toType.getValue())));
    819820      linkQuery.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(linkName)));
    820821      if (linkRestriction != null) linkQuery.restrict(linkRestriction);
    821       Iterator<AnyToAnyData> linkIterator = linkQuery.iterate(dc);
     822      Iterator<AnyToAnyData> linkIterator = HibernateUtil.loadIterator(linkQuery.getMainHqlQuery(dc, AnyToAnyData.class), false, null);
    822823      while (linkIterator.hasNext())
    823824      {
     
    830831      // Store the mapping between target item id and *Data object
    831832      Map<Integer, BasicData> targetMap = new HashMap<>(idMap.size());
    832       DataQuery<? extends BasicData> targetQuery = new DataQuery<>(toType.getDataClass(), null);
     833      AbstractEntityQuery targetQuery = new AbstractEntityQuery(toType, null, false)
     834      {};
    833835      targetQuery.restrict(new IdListRestriction("id", idMap.values()));
    834836      if (targetRestriction != null) targetQuery.restrict(targetRestriction);
    835       Iterator<? extends BasicData> targetIterator = targetQuery.iterate(dc);
     837      Iterator<? extends BasicData> targetIterator = HibernateUtil.loadIterator(targetQuery.getMainHqlQuery(dc, toType.getDataClass()), false, null);
    836838      while (targetIterator.hasNext())
    837839      {
Note: See TracChangeset for help on using the changeset viewer.