宣传邪恶

2020-09-02 10:21发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我当前正在调整某些流程... ...如果应用了促销,则在购物车修改(即:将产品添加到购物车)期间,平均时间从250毫秒增加。 到> 1秒!!

分析后,请注意执行了2000多个查询(购物车条目数为100)

但是,如果不应用促销活动,则查询数量"仅"约为100。

我需要解决方案! 我将感谢您的任何帮助(我尝试过CachedPromotionsManager,但似乎没有解决任何问题)

查找附带的两个屏幕截图(最详细的查询详细信息和所有查询): 最详细的查询详细信息

所有查询

的确感谢!

(154.6 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我当前正在调整某些流程... ...如果应用了促销,则在购物车修改(即:将产品添加到购物车)期间,平均时间从250毫秒增加。 到> 1秒!!

分析后,请注意执行了2000多个查询(购物车条目数为100)

但是,如果不应用促销活动,则查询数量"仅"约为100。

我需要解决方案! 我将感谢您的任何帮助(我尝试过CachedPromotionsManager,但似乎没有解决任何问题)

查找附带的两个屏幕截图(最详细的查询详细信息和所有查询): 最详细的查询详细信息

所有查询

的确感谢!

(154.6 kB)
付费偷看设置
发送
4条回答
Haoba3210
1楼 · 2020-09-02 10:59.采纳回答

Julio嗨,

我通常建议在每个店面相关立面上(通常是CartFacade和CheckoutFacade,CustomerFacade等)启用交易

除了具有ACID属性的交易优势外,由于延迟的存储机制,您已经注意到。

启用交易的副作用是:

  • 这将增加数据库锁定的持续时间。 通常,电子商务店面的可变数据和易变数据(购物车,用户帐户设置)不共享ACR,因此对并发用户不会有太大影响。

  • 如果需要在同一事务中查询/过滤在查询之前更新的数据,则可能必须显式刷新所有待处理的更新到数据库,以便获得一致的结果。 具体而言,这应该在非常罕见的情况下发生

每日技巧:通常,您可以使用Spring AOP声明式地启用事务。 以下XML代码段将使在CartFacade和CheckoutFacade接口和实现上声明的所有操作都是事务性的:

  
 
      
          
              
          
      
     
      
          
          
          
          
      
 
  

  
me_for_i
2楼-- · 2020-09-02 10:49

大家好,

采用这种促销服务的简单测试实现,将添加到购物车+促销更新操作的时间减少了10倍。

对此有什么陷阱吗?

我想知道为什么产品中仍然存在如此痛苦的东西。

谢谢__Julio

 公共类OptimizedPromotionsService扩展了ExtendedPromotionsService
  {
      @Override
      public PromotionOrderResults updatePromotions(最终集合 PromotionGroups,
              最终的AbstractOrderModel订单)
      {
          PromotionOrderResults结果;
 
          尝试
          {
              结果=(PromotionOrderResults)Transaction.current()。execute(新TransactionBody()
              {
                  @Override
                  公共对象execute()引发异常
                  {
                      返回OptimizedPromotionsService.super.updatePromotions(promotionGroups,order);
                  }
              });
          }
          捕获(最终异常e)
          {
              e.printStackTrace();
              结果= super.updatePromotions(promotionGroups,订单);
          }
 
 
          返回结果;
      }
      @Override
      public PromotionOrderResults updatePromotions(最终集合 PromotionGroups,
              最终的AbstractOrderModel订单,
              最终的布尔值validateRestrictions,最终的AutoApplyMode productPromotionMode,最终的AutoApplyMode orderPromotionMode,
              最终日期日期)
      {
          PromotionOrderResults结果;
 
          尝试
          {
              结果=(PromotionOrderResults)Transaction.current()。execute(新TransactionBody()
              {
                  @Override
                  公共对象execute()引发异常
                  {
                      返回OptimizedPromotionsService.super.updatePromotions(promotionGroups,order,evaluateRestrictions,
                              productPromotionMode,orderPromotionMode,日期);
                  }
              });
          }
          捕获(最终异常e)
          {
              e.printStackTrace();
              结果= super.updatePromotions(promotionGroups,order,evaluateRestrictions,
                      productPromotionMode,orderPromotionMode,日期);
          }
 
 
          返回结果;
      }
  }
  
渐行渐远_HoldOn
3楼-- · 2020-09-02 10:51

对此的快速解决方案是打开内存cnd促销缓存,但是这取决于您的业务需求是否允许您执行此操作。 升级缓存中的内存将避免所有这些查询。 以下是将两者同时启用的步骤:

1)将以下行添加到您的local.properties文件中以打开内存中的购物车:

  default.session.cart.type = InMemoryCart

  

2)取消注释Promotions-spring.xml文件中的以下bean,以打开促销缓存:

  
            
      
      
 
      
 
      
 

  

如果由于商业原因不能使用内存购物车,则另一个选择是覆盖DefaultCommerceCartCalculationStrategy中的calculateCart方法。 您可以在计算购物车时取消促销计算。 如果不需要您的迷你购物车显示该订单的总价,则可以在此处取消,因为当您单击以查看您的主购物车或去结帐时,它将调用recalculateCart,它仍将完整地保留促销计算逻辑并进行计算 订单已满。

clever101
4楼-- · 2020-09-02 10:52

我的航班延误了,我有时间进一步调查...

上面的踪迹显示了N + 1问题的明确情况( http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue

深入Hybris JALO持久层,我已经意识到,设置属性后,当且仅当没有当前事务正在运行时,数据库才会更新...

...所以,为什么不在自己的交易中不执行-促销更新?

以下代码可以解决问题:

result =(PromotionOrderResults)Transaction.current()。execute(new TransactionBody(){
  @Override
        公共对象execute()引发异常
        {
            返回ExtendedPromotionsService.super.updatePromotions(promotionGroups,order);
        }
       });
  
此后,在下面的探查器跟踪中找到(122个条目):

  • 这样做有什么陷阱吗?
  • 更重要的是,为什么Hybris不能以这种现成的方式(OOTB)进行?

另一方面:-看一下事件探查器,我们仍然遇到N + 1问题(每个购物车条目一个数据库命中),有没有办法预取同级条目以将其转换为N + 1/x问题 ?

我认为促销是电子商务的真正重要领域,而延迟迁移到服务层是痛苦的。 请注意OOTB上的帖子

另一方面,的确感谢杰弗里的支持:

  1. 我不太了解使用InMemoryCart的便利性,似乎计算无法按预期进行,对吗?
  2. 我已经将促销扩展从5.2.0.2迁移到了5.0.3,在这种情况下(添加到购物车)似乎没有任何改善。 无论如何,我不太了解内部的以下行是什么?

      bean id =" de.hybris.platform.jalo.order.Cart" class =" de.hybris.platform。  promotions.jalo.order.PromotionCart" scope =" prototype"/>  

周末愉快。 现在,我对上面介绍的方法感到满意!

一周热门 更多>