Since we don't change environment per knowledge session, we cache the environment and use it when we create a new stateful knowledge session. It is questionable if we need to create environment per knowledge session (e.g., Environment env = KnowledgeBaseFactory.newEnvironment();)
We chose to cache the environment, and we experienced the problems that was described in my previous section. As a resolution, my team set an additional environment property by using putting the emf.createEntityManager() into EnvironmentName.APP_SCOPED_ENTITY_MANAGER as follows:
private static Environment env = null;
...
env = KnowledgeBaseFactory.newEnvironment();
...
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
...
env.set(EnvironmentName.APP_SCOPED_ENTITY_MANAGER,
emf.createEntityManager());
...
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
...
After the above setting, the ksession.dispose() no longer created a problem. Here is my question, what is the best practice on the enviroment creation? Should we cache it or should we create it per knowledge session?
thanks,
bwj