一尘不染

Drools规则模板-第一次调用比子序列调用慢1000倍

tomcat

我已经使用Drools 6.4.0.Final构建了Drools规则模板。

它与此处提供的示例几乎相同。

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

我注意到第一次调用总是很慢才能得到结果,并且随着xls电子表格中行数的增加而变得越来越慢。

我想象当第一个KieSession创建时,流口水会建立一个索引。并且该索引随后被缓存,从而使进一步的调用更快吗?

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

例如,我看到第一个调用花费30秒,而随后的每个调用花费20毫秒,其中电子表格有约1000行。

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


阅读 873

收藏
2020-06-16

共1个答案

一尘不染

在您链接的示例中,有一行正在做的事情比看起来正在做的要多。我要说的是:

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

里面的步骤之一KieContainer.newKieSession()创建KieBase指定的KieSession所属。A
KieBase是规则的二进制表示形式。一旦KieBase建成,它可以被用来生成多个KieSessions(与其对应运行时)。创建a
KieBase可能非常耗时。KieSessions从它产生新的不是。

KieContainer类使用内部地图,以保持该基准KieBases已经建立了。第一次你问KieContainer一个KieSessionKieContainer具有率先建成的KieBase。调用newKieSession()后将重用已经构建的KieBase。请注意,只要您始终要求相同,便是正确的KieSession。尝试拥有多个KieBases并要求与之不同KieSessions,您会发现,第一次KieSession从新要求中会有一个KieBase延迟。

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

希望能帮助到你,

2020-06-16