Apex代码优化01
来源:互联网 发布:python遗传算法 编辑:程序博客网 时间:2024/06/16 16:03
情景介绍:在项目的demo期,为了快速完成任务,有时候难免在项目上写出一些性能极差的代码,比如hard code(没有遵循可配置化的思想实施),再比如在for循环里面做查询。本节我们将针对在for循环里面做查询这个主题做优化分享。
Q1:什么是query 101错误?
A:通俗的讲,就是查询次数太多超出了API限制。
Q2:有代码实例来再现这个问题吗?
A:以促销为例展开说明。
描述:假设我们有一个促销,促销指对某一类产品,我们设置一个促销规则,然后推送给需要care的用户。这时,我们设计了促销,促销详细,促销产品这三个master-detail的关系对象。其中促销对象用来记录促销起止日期,促销的DM单,促销的状态和发布情况;促销详细记录某类产品的促销最小数量,折扣;促销产品是根据促销详细中产品类型过滤出来的产品中选择的具体产品项。
目标:为了避免选择的促销详细重复,我们需要在促销详细新建时提示已重复的促销详细所选的产品类型 - 用Trigger实现。
优化前的Code展示:
public class ACC_PromotionDetailTriggerHandler extends ACC_TriggerHandler { public override void beforeInsert() { for(ACC_Promotion_Detail__c pd : (List<ACC_Promotion_Detail__c>)Trigger.New) { Set<String> productTypeSet = new Set<String>(); List<ACC_Promotion_Detail__c> pdList = new List<ACC_Promotion_Detail__c>(); pdList = [SELECT ACC_Product_Group__c, ACC_Product_Subgroup__c FROM ACC_Promotion_Detail__c WHERE ACC_Promotion__c = :pd.ACC_Promotion__c];for(ACC_Promotion_Detail__c pd1 : pdList) {productTypeSet.add(pd1.ACC_Product_Group__c + pd1.ACC_Product_Subgroup__c);} if(productTypeSet.size() > 0 && String.isNotBlank(pd.ACC_Product_Group__c) && String.isNotBlank(pd.ACC_Product_Subgroup__c)) { String productType = pd.ACC_Product_Group__c + pd.ACC_Product_Subgroup__c; if(productTypeSet.contains(productType)) { pd.addError(Label.ACC_Promotion_Detail_Validation_Not_Duplicated); } } } } }
分析:我们可以看出上述代码有两层遍历,之间加了一个select查询,如果数据量大的话,就可能出现query 101异常。
优化后的Code展示:
public class ACC_PromotionDetailTriggerHandler extends ACC_TriggerHandler { public override void beforeInsert() { Set<Id> promotionIdSet = new Set<Id>(); for(ACC_Promotion_Detail__c pd : ((List<ACC_Promotion_Detail__c>)Trigger.New)) { promotionIdSet.add(pd.ACC_Promotion__c); } if(promotionIdSet.size() > 0) { ACC_PromotionDetailTriggerFunction.duplicatePDIValidation(promotionIdSet, Trigger.New); } }}
public class ACC_PromotionDetailTriggerFunction { public static void duplicatePDIValidation(Set<Id> promotionIdSet, List<ACC_Promotion_Detail__c> pdList) { Map<String, ACC_Promotion_Detail__c> productType2PDMap = new Map<String, ACC_Promotion_Detail__c>(); List<ACC_Promotion_Detail__c> promotionPDList = [SELECT ACC_Promotion__c, ACC_Product_Group__c, ACC_Product_Subgroup__c FROM ACC_Promotion_Detail__c WHERE ACC_Promotion__c IN :promotionIdSet]; System.debug('promotionPDList: ' + promotionPDList); if(!promotionPDList.isEmpty()) { for(ACC_Promotion_Detail__c ppd :promotionPDList) { productType2PDMap.put(ppd.ACC_Promotion__c+ppd.ACC_Product_Group__c+ppd.ACC_Product_Subgroup__c, ppd); } System.debug('productType2PDMap: ' + productType2PDMap); } if(productType2PDMap.size() > 0) { for(ACC_Promotion_Detail__c pd :pdList) { System.debug('mapValue: ' + productType2PDMap.get(pd.ACC_Promotion__c+pd.ACC_Product_Group__c+pd.ACC_Product_Subgroup__c)); if(productType2PDMap.get(pd.ACC_Promotion__c+pd.ACC_Product_Group__c+pd.ACC_Product_Subgroup__c) != null) { pd.addError(Label.ACC_Promotion_Detail_Validation_Not_Duplicated); } } } }}
总结:优化后的代码,实现了代码分层,避免了for循环里面做查询。
阅读全文
1 0
- Apex代码优化01
- 热烈庆祝Apex代码突破1500行...2006-1-4
- salesforce中自定义button执行js调用后台apex代码
- apex (卓亮)
- APEX checkbox
- apex:dataTable
- apex:actionSupport
- Apex类
- apex:SelectRadio
- apex:actionRegion
- 用apex代码通过Trigger提交审批/在List View上批量提交与审批
- Apex中DMA的代码.代码主要来自LINUX.:)其实这些代码已经都比较成熟了.
- 代码优化
- 代码优化
- 优化代码
- 代码优化
- 代码优化
- 代码优化
- 【vjudge】八数码问题
- Hadoop2.9.0安装与配置 免密登录配置
- Server Tomcat v7.0 Server at localhost failed to start.分析解决办法
- SSL证书与发起https请求获取结果
- java 8 代替 null 的类 Optional
- Apex代码优化01
- sram sdram prom eprom eeprom norflash norfalsh pflash区别
- 开发即时通信是选择UDP还是TCP协议
- sql查询语句执行顺序详解
- 关于远程登录mysql5.7服务器没有权限的问题
- 选择排序-c++代码实现
- printf()和scanf()的*修饰符
- 《STK二次开发 C++版》S1:STK介绍
- 判断指定的年月日是不是周六或周天