JBPM和Hibernate配置文件加载问题,如何只加载一次

转载:http://ceapet.com/blog/index.php?option=com_content&view=article&id=203:jbpmhibernate&catid=38:java&Itemid=64

    我目前正在研究jbpm,在使用过程中发现,每次使用以下操作时Tomcat控制台输出大量信息,看样子是配置文件的加载信 息。   

jbpmConfiguration = JbpmConfiguration.parseResource("jbpm.cfg.xml");
jbpmContext =  jbpmConfiguration.createJbpmContext();

configuration = new Configuration().configure();

    每当执行一个页面请求时,配置文件似乎重新被加载了一次,导致一个页面花费很长时间才打开,而且java.exe的内存消耗直线上升,CPU也是 100%,最后,java就报java.lang.OutOfMemoryError,页面无法打开。

    这是什么原因呢,我刚学java,以为通过java垃圾回收机制可以解决java.lang.OutOfMemoryError,试了半天也不见效果。后 来,想想应该是配置文件加载的次数太多,能不能只加载一次呢?我看了jbpm-console在启动时,Tomcat控制台会有大量信息输出,当点击页面 时,页面反应很快,而且后台也没有输出。我觉得这种方法可行。在网上寻找的事例中,基本上都是先创建jbpmContext,然后再 jbpmContext.close(),并没有那个人告诉你,真正的程序开发中,这种代码不可行。

    我尝试着先创建一个类main.java,用来创建jbpmConfiguration、jbpmContext之类的对象,然后将这个类在faces- config.xml中设置成application。其它类药要使用jbpmContext的时候,直接调用new main().jbpmContext。这样的一个设想,居然解决了我的问题,cpu不再100%,java.exe的内存消耗不再直线攀升到 390M,Tomcat控制台不再有大量信息输出,真是爽啊。

我 的main.java是这样写的:

package qdcm.jbpm;

import org.hibernate.cfg.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.db.TaskMgmtSession;

public class main
{
    public static JbpmContext jbpmContext;
    public static JbpmConfiguration jbpmConfiguration;
    public static Configuration configuration;
    public static Session session;
    public static SessionFactory sessionFactory;
    public static GraphSession graphSession;
    public static TaskMgmtSession taskMgmtSession;
    public main()
    {
        //Jbpm Configuration
        if(this.jbpmConfiguration == null)
        {
            jbpmConfiguration = JbpmConfiguration.parseResource("jbpm.cfg.xml");
        }
        if(this.jbpmContext == null)
        {
            jbpmContext =  jbpmConfiguration.createJbpmContext();
        }
        if(this.graphSession == null)
        {
            graphSession = jbpmContext.getGraphSession();
        }
        if(this.taskMgmtSession == null)
        {
            taskMgmtSession = jbpmContext.getTaskMgmtSession();
        }
        //Hibernate Configuration
        if(this.configuration == null)
        {
            configuration = new Configuration().configure();
        }
        if(this.sessionFactory == null)
        {
            sessionFactory = configuration.buildSessionFactory();
        }
        if(this.session == null)
        {
            session = sessionFactory.openSession();
        }
    };
}

在product.java中这样使用:
tasks = new main().taskMgmtSession.findTaskInstancesByProcessInstance(pi);
Query query = new main().session.getNamedQuery("getAllProduct");


希望我的这个发现,可以帮助你解决类似的问题。& lt;/font>
原文地址:https://www.cnblogs.com/liuzhengdao/p/1495136.html