本系列文章将分篇展开《EKP 性能开发最佳实践》中的重要技术点,帮助开发者快速了解和实施EKP性能优化方案。
-
描述 RequestCacheUtils 的作用、场景
-
代码示例
-
结合实际场景分析效果
在日常开发中,我们经常会遇到同一个请求中重复计算同一结果的场景。尤其在流程发起、页面加载等操作中,如果某段代码在一次请求中被多次调用,并且返回结果一致,那么就存在显著的优化空间。EKP 提供的 RequestCacheUtils
工具类,正是为解决这一问题而生。
一、核心思想
通过将计算结果缓存到 HttpServletRequest
的 attribute 中,确保在同一次请求内,仅执行一次耗时逻辑,其它调用直接返回缓存结果。

二、使用方式
String cacheKey = "__getSysListshowCategory:" + model + "#" + page;
SysListshowCategory result = RequestCacheUtils.getValueFromRequest(cacheKey, () -> {
HQLInfo hqlInfo = new HQLInfo();
hqlInfo.setWhereBlock(" sysListshowCategory.fdModel = :fdModel");
hqlInfo.setParameter("fdModel", model);
return (SysListshowCategory) findFirstOne(hqlInfo);
});
-
cacheKey
:缓存键值,建议业务自定义并保证唯一性。 -
第二个参数是
Supplier
接口的 Lambda 表达式,表示真正的计算逻辑。 -
如果该 key 第一次被访问,则执行逻辑;否则直接从 request attribute 中取结果。
三、典型使用场景
-
字典数据查询:某些下拉框的数据在一次请求中被多次使用,比如流程表单加载时。
-
权限判断逻辑:如某用户是否有某操作权限,在多个组件中都需要使用。
-
模型查询封装:如
getCategory(model, page)
这种需要访问数据库的封装方法。 -
流程定义获取处理人:如
fetchAllDefHandlers()
获取流程节点定义的处理人,在一个请求内多次获取。
四、性能效果分析
以一次表单加载为例,使用 RequestCacheUtils 之后:
-
原来相同数据库查询可能被执行3~5次,如今仅执行1次。
-
若涉及Redis缓存、权限判断等接口逻辑,还可进一步降低外部依赖请求数量。
-
缓存粒度精确到 request 生命周期,不影响线程安全。
五、注意事项
-
不适合缓存变化频繁的数据(如在线状态、计数器)。
-
缓存 key 尽量明确唯一,避免数据交叉污染。
-
仅限于单个请求生命周期,不可替代全局缓存方案(如Redis)。
通过合理使用 RequestCacheUtils
,不仅提升了代码运行效率,也让整体系统具备更好的吞吐能力,是EKP开发中非常实用的一项优化手段。