使用jboss drools引擎遇到性能问题。为每个呼叫/请求创建KnowledgeBase对象是一个问题吗?

时间:2014-10-26 14:45:08

标签: drools

使用jboss drools引擎解决性能问题。

下面是示例代码。

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();
        for (RuleDO ruleDO : ruleDOs) {
            String drool = ruleDO.getDrool();
            Reader reader = new StringReader(drool);
            kbuilder.add(ResourceFactory.newReaderResource(reader),
                    ResourceType.DRL);
        }

        KnowledgeBase kbase = kbuilder.newKnowledgeBase();
        Notification notification = new Notification();

        StatelessKnowledgeSession ksession = kbase
                .newStatelessKnowledgeSession();
        ksession.setGlobal("notification", notification);
        ksession.execute(device);

我在进行性能测试时接受了线程转储,发现在两行以下花费了更多时间。

kbuilder.add(ResourceFactory.newReaderResource(reader), ResourceType.DRL);

并且

KnowledgeBase kbase = kbuilder.newKnowledgeBase();

为每个调用/请求创建KnowledgeBase对象是一个问题吗?

我应该在我的应用程序中缓存KnowledgeBase吗?

1 个答案:

答案 0 :(得分:1)

答案是"是"和"是"。

此外,您正在以相当环境的方式创建知识库,在另一个之后添加一个规则。更快的方法是将字符串收集到一个字符串中并将其作为一个整体添加。

请注意,Drools专家手册中详细记录了序列化已编译的知识库以进行重复反序列化的技术。

此外,您的问题标题似乎表明您的基于规则的应用程序需要重复的独立请求,这可以通过独立于同一知识库对象创建的会话来有利地处理。