Session 如何决定在哪里举行会议

Session 如何决定在哪里举行会议,session,drools,Session,Drools,我们正在使用JPAKKnowledgeService进行持久化drools会话。 我们根据drools用户手册中的指南进行配置和实现,如下所示: KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); loadDRL(kbase); // method to load the DRL rules to kbase Environment env = KnowledgeBaseF

我们正在使用JPAKKnowledgeService进行持久化drools会话。 我们根据drools用户手册中的指南进行配置和实现,如下所示:

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        loadDRL(kbase); // method to load the DRL rules to kbase

        Environment env = KnowledgeBaseFactory.newEnvironment();
        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory( "org.drools.persistence.jpa"));
        env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());

StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
        ksession.insert(new Event());
        ksession.fireAllRules();

        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(ksession.getId(), kbase, null, env);
        ksession.insert(new Event());
        ksession.fireAllRules();

        ksession.dispose();
第一次使用有状态会话时,我们需要新建它
jpakknowledgeservice.newStatefulKnowledgeSession(kbase,null,env)
。 第二次或第三次在同一线程中使用同一会话时,我们可以从DB
jpakknowledgeservice.loadStatefulKnowledgeSession(ksession.getId(),kbase,null,env)重新加载会话,或者只在工作内存中使用会话

但即使在同一个地方,在并发环境中,我们如何确定是需要从DB加载会话,还是只在工作内存中使用会话?它是否会自动检测工作内存中是否有会话,如果没有,将从DB加载


另外,在spring配置环境中,我们无法控制是新建会话还是从DB加载会话,还是只在工作内存中使用会话,它的执行情况如何?

使用spring,我建议创建一个充当会话工厂的
@服务。这样,您就得到了该服务的一个实例,它可以保存会话ID到会话的映射。如果会话不在映射中,则从DB加载它。然后。。。如果每个用户会话有一个知识会话,那么您也可以使用会话范围bean,它在启动时从DB加载。@Steve您可以共享会话范围bean的链接/代码吗?我发布了另一个问题。在我的测试期间,我不能让它在启动时从DB重新加载。我遗漏了什么吗?你用
@Scope(“session”)
注释了
@Service
@Autowire
将其插入一个
@Controller
中,每个用户都将有自己的个人服务实例与其HTTP会话相关联。