作为我项目的一部分,我正在实施一个基于SpEL
的规则引擎,我想尽可能提高效率。基本上,引擎由SpEL
语法中的持久条件组成。当需要评估输入时,我向DB查询相关规则 - SpEL
表达式,这些表达式在包含输入对象的EvaluationContext
上运行。
我已经在应用程序中使用了Ehcache,所以我也希望在此服务中使用缓存。 EvaluationContext
缓存是不可能的,因为每个请求的输入都不同。缓存数据库查询也不是那么容易,因为特定日期是查询的一部分 - 不同的规则在不同的时间有效。
我考虑过缓存已解析的Expression
个对象,但我不知道解析来自Expression
的{{1}}是多么昂贵,以及是否节省了时间来避免String
解析必须通过Expression
查询缓存。
是否有人知道使用缓存存储已解析的Spring
对象是否有效?
非常感谢
答案 0 :(得分:1)
这可能取决于表达式的复杂性,但我希望缓存在所有情况下都是值得的,除非是最简单的表达式。
为什么不运行一些性能测试?
修改强>
EvaluationContext
缓存是不可能的,因为每个请求的输入都不同。
您通常可以重复使用评估上下文;只需将根对象与上下文一起传递给表达式getValue()
,而不是将其存储在上下文中。
Object getValue(EvaluationContext context, Object rootObject) throws EvaluationException;
但有一个例外是,如果每次评估需要不同的#variables
。
答案 1 :(得分:1)
您可以使用SpEL编译进行进一步的优化。
查看SpEL官方文档中的SpEL编译和编译器配置部分: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-spel-compilation