Governor Limits — Per-Transaction Apex Limits

DEX455 - Apex 电子邮件服务、Visualforce、AJAX 与事务限制完全指南

📄 第 268 页 🎬 视频课程

课程章节介绍

同学们,今天我们来讲一个非常重要的概念,叫做州长执行限制,也就是Governor Limits。为什么叫州长?其实就是像一个严格的州长,时刻盯着你的程序,确保你不会一个人用掉整个平台的资源。Salesforce是一个多租户平台,意思是所有客户共享同一套基础设施,所以必须保证每家公司、每个事务都公平地占用资源,不能让一个写得不好的代码把其他人都拖慢。 那么,在一个事务里,比如一次按钮点击、一个Web服务调用,Apex会受到哪些限制呢?我们分几类来看。 首先是关于数据库查询的。你最多只能执行100个SOQL查询,前提是同步操作。那同步是什么意思呢?就是用户在前台点一个按钮,系统立刻响应,页面还在等着结果。这时候SOQL查询数不能超过100个。另外,所有查询返回的总行数不能超过5万行。这5万行不是说一个查询最多5万,而是这一个事务里,所有查询加起来返回的行数,最多5万。 然后是DML操作,也就是增删改查里除了查之外的操作。我们叫它DML语句,限制是150个。总记录行数不能超过1万行。什么意思呢?你一次插入100条记录,就算一次DML,100条都算在1万行的限额里。如果你用了很多次DML,不仅要看次数,还要累计行数。 接下来是执行时间的限制。同步事务里,CPU时间不能超过10秒。CPU时间不是墙上挂的钟表时间,而是服务器真正花在运行你代码上的时间。如果数据库查询慢,可能不占你的CPU时间,但代码循环、运算这些就会消耗。还有堆内存,也就是你的代码里声明的变量、集合这些占用的内存,同步事务最多6 MB,异步能到12 MB。 说到异步,也就是后台运行的操作,比如未来方法、批处理这些,限制会宽松一些。同步操作刚才说了100个SOQL、10秒CPU、6 MB堆;异步操作允许200个SOQL,CPU时间60秒,堆内存12 MB。所以,尽量把重活放到后台去做,这也是我们设计的原则。 还有一个在任何一个事务里都有限制的是对外部的调用。你的代码可以调用外部的Web服务,或者通过HTTP请求发出去,最多100次调用,而且这100次调用的累积超时时间是120秒。也就是所有调用加起来等待的时间不能超过120秒,防止你一直卡住。 除了每个事务的限制,还有每天的总限制。一个组织每天最多能执行25万次批处理里的异步方法,或者按照用户许可证数量乘以200来计算,两者取高的那个。这个主要针对频繁运行的异步作业。 另外,如果你从AppExchange装了一些认证的托管包,这些包里的代码也有自己的单独限制,和你的主限制是分开的。这样就不会因为你写了自己的代码,就挤占了托管包应用的资源,反过来也一样。所以平台考虑得很周全,防止互相干扰。 总结一下,每一次事务就像一次考试,州长就是监考老师,他给你规定了答题时间、纸张数量、翻书次数等等。你要在限制内完成任务,如果超过,系统就会毫不留情地抛出异常。这听起来很严格,但正是这种设计,让Salesforce这个巨大的共享平台始终保持稳定、安全、高效。所以,写代码时,心中一定要有这些限制,养成好的习惯,比如少用循环里的SOQL,及时释放内存,能用异步就异步。这样你的应用才能跑得又快又稳。 好,关于州长执行限制,我们就先讲到这里。有什么问题,大家可以随时提。

关键词

Apex Salesforce Developer Guide