zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/liuzhengdao/p/1495136.html
Copyright © 2011-2022 走看看