0

当我刚接触 drools 时,我浏览了一些论坛并开发了一个使用 KnowledgeBuilder api 和 StatefulKnowledgeSessions 配置的 drools 的应用程序。当时的drools文件数量较少,并且与应用程序一起打包。在进行分析时,我发现口水消耗了大量内存并且内存分配率(TLAB)很高。这让我想到是否需要有一个缓存解决方案,以便在每次有应用程序请求时不创建 KnowledgeSessions。我的应用程序支持几乎 100 多种类型的事件,并且对于每个事件,我都有 3 种不同类型的 drools 文件,我一次执行一个以在中间过滤结果。此外,应用程序中的 drools 文件数量和更改/配置新的频率正在增加,我必须从应用程序包中外部化 drools。我有不同的drools文件来满足不同的需求,并不是每次都需要,所以我想保持一个REST服务备份一个NO-SQL数据库,只要我们想改变,这些数据库就会被注入其中。因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 所以我想保留一个 REST 服务备份一个 NO-SQL 数据库,只要我们想要更改,这些数据库就会被注入其中。因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 所以我想保留一个 REST 服务备份一个 NO-SQL 数据库,只要我们想要更改,这些数据库就会被注入其中。因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们 因此内存消耗/分配率可能会下降(猜测)我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水?目前我通过下面的 api 从文件系统中读取它们

KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
knowledgeBuilder.add(ResourceFactory.newClassPathResource("drools_conventions.drl"), ResourceType.DRL);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
StatefulKnowledgeSession kSession = knowledgeBase.newStatefulKnowledgeSession();
List filter = new ArrayList<>();
kSession.insert(dispatchFactInput);
kSession.setGlobal("Rule", filter);
kSession.fireAllRules();
kSession.dispose(); ```

Can I cache Knowledgebase/StatefulKnowledgeSession?

Since I am new to drools I would like to take opinions/suggestions, learn to implement the best/possible solution to above situation.
4

1 回答 1

0

我认为你可以看看无状态会话。我认为如果您只是插入事实、触发规则然后立即处理 KieSession,那是您的最佳选择。除此之外,在较新的 Drools 版本中已经有一个可用的会话缓存机制。

于 2020-01-13T14:55:15.230 回答