java - Drools 规则模板 - 第一次调用比后续调用慢 1000 倍

标签 java tomcat drools rule-engine

我构建了一个 Drools Rules Template使用 Drools 6.4.0.Final

它与提供的示例几乎相同 here .

我将它包装在 Spring RestController 中并将其作为 WAR 部署到 Tomcat 中。

我注意到第一次调用获取结果的速度总是很慢,并且随着 xls 电子表格中行数的增加而变慢。

我想 drools 在创建第一个 KieSession 时会构建一个索引。并且该索引随后被缓存,从而使进一步的调用更快?

我在直接从单元测试调用时看到了相同的行为。第一次测试很慢,后续测试快 1000 倍。

例如,我看到第一次调用需要 30 秒,每次后续调用需要 20 毫秒,其中电子表格大约有 1000 行。

有没有办法在 Web 应用程序服务器 (Tomcat) 启动时强制执行此“索引”步骤?

最佳答案

在您链接的示例中,有一条线的作用比看起来要大。我要说的是:

KieSession ksession = kc.newKieSession( "DTableWithTemplateKS" );

KieContainer.newKieSession() 中的一个步骤是 create the KieBase指定的 KieSession 属于。 KieBase 是您的规则的二进制表示。一旦构建了 KieBase,它就可以用于生成多个 KieSessions(它们的运行时对应物)。创建 KieBase 可能非常耗时。不是从它生成新的 KieSessions

KieContainer 类使用 internal Map保留对已构建的 KieBases 的引用。第一次向 KieContainer 请求 KieSession 时,KieContainer 首先构建 KieBase。在调用 newKieSession() 之后将重用已经构建的 KieBase。请注意,只要您始终请求相同的 KieSession,情况就是如此。尝试使用多个 KieBases 并向它们请求不同的 KieSessions ,您会发现第一次从新的 请求 KieSession >KieBase 你会遇到这种延迟。

您可以做的一件事是在您的应用程序启动时向 KieContainer 询问您的 KieBase。您可以通过执行 kc.newKieSession( "XXX");kc.getKieBase("YYY");

来完成此操作

希望对你有帮助

关于java - Drools 规则模板 - 第一次调用比后续调用慢 1000 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247847/

相关文章:

java - 有没有比模仿 splat 运算符更简单的替代方法?

java - 如何在 Mac 中获取 Tomcat 的堆转储和线程转储

java - 如何连接 Hibernate 和 Drools

java - drools 中的函数库

java - J2ME 命令命令

java - JAXB XML 自定义 namespace

java - RxJava 中 doOnNext(...) 的目的是什么

tomcat - 如何更改 Apache Tomcat 8.x 中的图标

node.js - Node.js 与 Tomcat 有何不同

DROOLS 模式匹配具有复杂对象的嵌套列表