无状态知识会话和有状态知识会话之间有什么区别。我读了一些文档都处于维护状态。但是我什么时候可以使用无状态/有状态知识会话。
答案 0 :(得分:16)
无状态: 在触发规则之前,事实/工作存储器被插入到知识库会话中。可以通过在执行规则时调用对象上的公共方法来设置这些事实,并在设置这些对象后返回更改的值。
执行规则时事实上的任何更改(例如insert(xyz)
或modify(xyz)
)都不会知道规则引擎。
有状态: 在触发规则之前将事实/工作内存插入知识库会话,并且在触发规则之后,必须调用dispose()以避免内存泄漏。
执行规则时事实的任何变化,例如insert(xyz)
或modify(xyz)
,都会使规则引擎知道。
答案 1 :(得分:6)
无状态意味着为每个请求创建一个新会话(因此不维护任何状态)。有状态意味着它将从前一个命令结束时的会话状态继续(例如,插入到会话中的所有数据仍然存在)。
答案 2 :(得分:5)
我看到的方式的基本区别在于会话在无状态下自动处理的方式。选择一个与其他相比,没有任何性能提升。实际上,无状态会话使用它后面的有状态会话。那就去吧!
答案 3 :(得分:1)
我想在这里引用drools文档,这让我明白了。
" StatelessKnowledgeSession提供了一个方便的API,包装 StatefulKnowledgeSession。它避免了调用dispose()的需要。 无状态会话不支持迭代调用,即行为 调用execute(...)是一种内部单击方法 实例化StatefulKnowledgeSession,添加所有用户数据和 执行用户命令,调用fireAllRules,然后调用dispose()。"
基本上,无状态会话是一次使用的有状态会话。
这意味着无状态会话也可以做推理,不像许多文档和这里的一些答案所说的!这应该只取决于"然后"规则的一部分,无论你使用"修改"或不。
虽然我自己没有验证,但这篇文章似乎支持我的推理。
https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g
答案 4 :(得分:0)
在有状态会话中,即使在之前触发规则之后,我们也可以修改事实并重新插入事件。
另一方面,在无状态会话中,一旦所有规则被触发(使用execute()
),我们就无法进一步修改事实并将它们重新插入到会话中(因为会话在{{1}之后无法使用被称为)。
答案 5 :(得分:0)
此链接准确无误:https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g 流口水应该在官方文件中添加。
有状态:“插入的数据对象将成为工作内存的一部分,以后可以重复使用以进一步执行规则。”
无状态:“在执行规则后,插入的数据对象将不会存储在工作存储器中”。