Apex开发指南--利用缓存去避免governor limit

学习目的
1,利用静态变量做缓存避免governor limit

governor limit

salesforce是一个多租户的云平台,为了是每个租户能够欧公平的使用公共资源,所以平台就多垄断资源的行为做了很多限制。比如查询次数限制,dml操作次数限制,callout限制,future限制等等。那么在实际的开发过程,我们往往存在业务逻辑可能会触碰到这些限制。今天分享一个使用静态变量做缓存避免限制。

静态变量

在定义静态变量上,使用static关键字。
不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。
初始化,在程序初始化的时候,static定义的变量就会初始化一次,并且在整个程序周期,只会初始化一次。

利用静态变量做缓存

在写apex类或者trigger的时候,我们经常会去查询数据,在一个事务里面查询次数是100。有时候一些数据可能我们在每个方法里面都要使用,那么我们是查询一次出来,然后供多个地方使用,还是每次要使用的时候去查询呢?这个很明显,肯定是一次查询,多处使用。以下有一个例子:
在User对象上有一个字段UserIsSpecial__c。如果每次要使用这个字段就去查一次数据库,那么就会过多的增加查询次数。我们可以写一个公共的方法来做缓存。

缓存

缓存:简单理解就是为了使代码和持久层交互减少,减少吃就成的压力。比如A要去查一个用户的信息,那么先去缓存里面查,如果有就不去数据库里查了,没有再去数据库查询。关于缓存,是一个很重要的内容。可以在网上找相关资料学习,例如:如何设置缓存机制,缓存击穿,缓存溢出等

在这里插入图片描述
如果代码就想上面,每个地方需要,每个地方调用。那么很可能出现查询次数过多的异常。
在这里插入图片描述
把IsUserSpecialChecked作为缓存标识,如果为true,表示缓存里面包含了该值,不需要再执行查询操作,直接返回当前静态变量UserIsSpecial里面的值。
把这个方法封装好以后,在任何要使用的地方去使用**类名.方法名()**就可以使用了。

在这里插入图片描述
这张图里的代码是一个样例,就是获取当前用户所在的时区,这个在很多地方都会用到。就比如针对每一个用户,而用户所在时区不一样,我们需要展示的数据要根据当前时区进行每日更新。那么我们就会使用到时区。而获取时区,是一个频繁的操作,所以可以利用到缓存的思想。

静态变量做缓存的好处和坏处

好处:能够减少查询次数,避免,meet limit
坏处:因为每个静态变量都是存储在heap里面,而salesforce对heap也有limit,所以在当要缓存大量数据的时候还是会触碰限制。
总体来说,当我们在使用数据量小,而且频繁的场景下,使用静态变量做缓存能够很好的避免触碰限制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章