• 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>
  • 相关阅读:
    python3 bytes数据类型探讨
    字典
    列表及元组
    在py文件中设置文件头
    函数的作用域、global与nonlocal
    python中 的意义及用法
    int、bool和str
    while循环、格式化输出、运算符和编码初识
    python初认识、基础数据类型以及 if 流程控制
    列表遍历和生成器遍历效率对比
  • 原文地址:https://www.cnblogs.com/liuzhengdao/p/1495136.html
Copyright © 2020-2023  润新知