SpEL - parseExpression性能

时间:2018-01-07 17:07:09

标签: java spring spring-el

作为我项目的一部分,我正在实施一个基于SpEL的规则引擎,我想尽可能提高效率。基本上,引擎由SpEL语法中的持久条件组成。当需要评估输入时,我向DB查询相关规则 - SpEL表达式,这些表达式在包含输入对象的EvaluationContext上运行。

我已经在应用程序中使用了Ehcache,所以我也希望在此服务中使用缓存。 EvaluationContext缓存是不可能的,因为每个请求的输入都不同。缓存数据库查询也不是那么容易,因为特定日期是查询的一部分 - 不同的规则在不同的时间有效。

我考虑过缓存已解析的Expression个对象,但我不知道解析来自Expression的{​​{1}}是多么昂贵,以及是否节省了时间来避免String解析必须通过Expression查询缓存。

是否有人知道使用缓存存储已解析的Spring对象是否有效?

非常感谢

2 个答案:

答案 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