转载: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.OutOfMemor[size=medium][/size]yError,试了半天也不见效果。后来,想想应该是配置文件加载的次数太多,能不能只加载一次呢?我看了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");
希望我的这个发现,可以帮助你解决类似的问题。
我目前正在研究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.OutOfMemor[size=medium][/size]yError,试了半天也不见效果。后来,想想应该是配置文件加载的次数太多,能不能只加载一次呢?我看了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");
希望我的这个发现,可以帮助你解决类似的问题。