项目框架:struts1,hibernate3
获取session的方式是opensession,不是getCurrentSession。
连接池:ProxoolConf
莫名的出现了session is closed的问题。
解决方案: 有关jbpm4.4的方法都重新获取jSession,获取完后关闭。
Session jSession = null;
Transaction jbpmts = null;
try {
jSession = JBPMUtil.getJbpmSession(processEngine);// 不论是否是查询,始终获取一下session,进行内部初始化.防止Session is closed.
jbpmts = jSession.getTransaction();
jbpmts.begin();
jbpmts.commit();
} catch (Exception e) {
BugUtil.addBug(e);
e.printStackTrace();
if (jbpmts != null) {
jbpmts.rollback();
}
request.setAttribute("error", StringUtil.alert("系统错误", "back"));
return mapping.findForward("errorPage");
} finally {
JBPMUtil.closeJbpmSession(jSession);
}
public static Session getJbpmSession(ProcessEngine processEngine) {
// 数据库连接的打开,关闭、事务的打开、提交等都属于运行期环境应该做的事情。Environment 作用:线程安全对象,为每个线程维护一系列的资源
EnvironmentImpl environmentImpl = ((EnvironmentFactory) processEngine).openEnvironment(); // 获取运行时环境
DbSessionImpl dbSessionImpl = environmentImpl.getFromCurrent(DbSessionImpl.class);// 我们一般像这样使用Environment获取资源对象,不要使用EnvironmentImpl的static方法,这样获取不到当前的session
return dbSessionImpl.getSession();
}
public static void closeJbpmSession(Session session) {
if (session != null && session.isConnected()) {
session.close();
}
}