`
ginge
  • 浏览: 211898 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring, JBPM持久化系列--摆脱LazyInitializationException 二

    博客分类:
  • JBPM
阅读更多
Spring, Springmodules, JBPM持久化集成--摆脱
LazyInitializationException(Part2)
Spring, Springmodules, JBPM持久化集成理解系列三
【本系列如需转载,请注明作者及出处】


到此,如果有朋友还是比较清醒的话,应该还会有疑问,在OpenSessionInViewFilter里如果是isSingleSession为true,并没有看到session的关闭,到底是在什么地方关闭了呢?它其实是在OpenSessionInViewInterceptor里关闭了的。

 

public void afterCompletion(WebRequest request, Exception ex) throws DataAccessException {
		String participateAttributeName = getParticipateAttributeName();
		Integer count = (Integer) request.getAttribute(participateAttributeName, WebRequest.SCOPE_REQUEST);
		if (count != null) {
			// Do not modify the Session: just clear the marker.
			if (count.intValue() > 1) {
				request.setAttribute(participateAttributeName, new Integer(count.intValue() - 1), WebRequest.SCOPE_REQUEST);
			}
			else {
				request.removeAttribute(participateAttributeName, WebRequest.SCOPE_REQUEST);
			}
		}
		else {
			if (isSingleSession()) {
				// single session mode
				SessionHolder sessionHolder =
						(SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory());
				logger.debug("Closing single Hibernate Session in OpenSessionInViewInterceptor");
				SessionFactoryUtils.closeSession(sessionHolder.getSession());
			}
			else {
				// deferred close mode
				SessionFactoryUtils.processDeferredClose(getSessionFactory());
			}
		}
	}

 

 

 

总结一下:

OpenSessionInViewFilter首先会确保sessionFactory的存在,

如果启用了session延迟关闭策略,也就是isSingleSession为falsesession的创建和打开会在HibernateTemplateexecute里发生,而关闭会统一在OpenSessionInViewFilter返回时。

 

如果isSingleSessiontrue时,session的打开会在OpenSessionInViewFilter里或者之前的某个时候,而关闭会在OpenSessionInViewInterceptor里。

 

这样我们就可用自己在Junit或者其他应用场景使用延迟关闭策略来使我们的程序收益。以下附带前面篇章提及到的BaseTestCase,如果存在SessionFactory,则激活延迟关闭session策略。各位可用参考使用。

 

package com.cabernet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.transaction.support.TransactionSynchronizationManager;

/**
 * Supports OpenSessionInViewFilter like Hibernate Lazy-loading when
 * SessionFactory is present
 * 
 * @author ginge
 * 
 * @see OpenSessionInViewFilter
 */
public class BaseTestCase extends AbstractDependencyInjectionSpringContextTests
{
	protected Log				log			= LogFactory.getLog(this.getClass());

	private FlushMode			flushMode	= FlushMode.MANUAL;

	protected SessionFactory	sessionFactory;

	@Override
	protected void prepareTestInstance() throws Exception
	{
		// TODO Auto-generated method stub
		super.prepareTestInstance();

		if (isSessionFactoryPresent())
		{
			afterSessionFactorySet();
			SessionFactoryUtils.initDeferredClose(sessionFactory);
			TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(this.getSession()));
		}
	}

	@Override
	protected void onTearDown() throws Exception
	{
		// TODO Auto-generated method stub

		if (isSessionFactoryPresent())
		{
			SessionFactoryUtils.processDeferredClose(sessionFactory);
			TransactionSynchronizationManager.unbindResource(sessionFactory);
		}

		super.onTearDown();
	}

	private boolean isSessionFactoryPresent()
	{
		return this.sessionFactory != null;
	}

	protected void afterSessionFactorySet()
	{

	}

	public SessionFactory getSessionFactory()
	{
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory)
	{
		this.sessionFactory = sessionFactory;
	}

	@Override
	protected String[] getConfigLocations()
	{
		return new String[] { "classpath*:applicationContext-resources.xml" };
	}

	protected Session getSession() throws DataAccessResourceFailureException
	{
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
		FlushMode flushMode = getFlushMode();
		if (flushMode != null)
		{
			session.setFlushMode(flushMode);
		}
		return session;
	}

	private FlushMode getFlushMode()
	{
		return this.flushMode;
	}
}

 

 

 

 

到了这个时刻,我们回到Jbpm跟Springmodules, Spring的持久化集成上来,虽然Jbpm本身提供了JbpmContextFilter,它的功能是在Filter开始打开JbpmContext,Filter返回时关闭JbpmContext。但是在前面的篇章中,我们知道JbpmTemplate中会在操作开始前注入session。因此,使用了OpenSessionInViewFilter和JbpmTemplate之后,JbpmContextFilter将会英雄无用武之地。这个OpenSessionInViewFilter必须配置在其他Filter之前以确保在进入其他Filter之前激活延迟关闭策略或者绑定Session到当前线程中。

 

 

(完结)

分享到:
评论
1 楼 netment 2008-03-05  
仰慕ing

相关推荐

    spring-modules-jbpm31-0.6.jar

    spring-modules-jbpm31-0.6.jar,spring整合jbpm的jar包

    Spring-Jbpm-JSF-Example.pdf

    根据给定的文件信息,我们可以总结出以下关于“Spring-Jbpm-JSF-Example”的关键IT知识点: ### 1. **项目概述** 标题与描述提到的“Spring-Jbpm-JSF-Example.pdf”是一个示例项目,展示了如何将Spring框架、Jbpm...

    jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)

    jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载

    jbpm-jpdl-suite-3.2.3安装配置.doc

    在配置jbpm-jpdl-suite-3.2.3的过程中,需要注意以下几个关键步骤: 1. **环境准备**: - 首先,确保你已经安装了JDK 1.6,因为jbpm-jpdl-suite-3.2.3需要依赖Java运行环境。 - 安装Ant 1.7.1,这是一个Java编译...

    jbpm-starters-kit-3.1.2.part2.rar

    jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷

    jbpm-jpdl-suite-3.2.3的安装配置

    2. **jbpm-jpdl-designer-3.1.2.zip**:这是一个基于Eclipse的图形化流程设计工具,支持流程的可视化定制,避免直接编辑XML文件。同时,它还具有流程定义上传功能,方便将新定义的流程发布到jPDL系统。 3. **jbpm-...

    jbpm-jpdl-designer-site-3.1.7.zip

    jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip

    JBPM-----PPT

    - **持久化机制**:介绍JBPM如何利用数据库存储流程实例和变量,确保数据安全和流程恢复。 4. **平台特性:JBPM_(4)_Platform.ppt** - **jbpm-gwt-console**:一个基于GWT的Web管理控制台,用于监控和管理流程...

    jbpm-jpdl-suite-3.2.3.zip

    jbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3....

    jbpm-jpdl-suite-3.2.GA.zip-6

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm-workitems-5.1.0.Final-sources.jar

    jbpm-workitems-5.1.0.Final-sources.jar jbpm5 源码

    jbpm-bpmn2-5.1.0.Final.jar

    jbpm-bpmn2-5.1.0.Final.jar jbpm5

    jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3

    3. **jbpm-4.3版本**:这个版本是jBPM的一个重要里程碑,它可能包含了一系列的改进和新功能。例如,可能在性能优化、错误修复、新API的引入等方面有所提升,使得开发者能够更好地集成jBPM到他们的应用程序中。 4. *...

    jbpm-jpdl-designer-nodeps-3.1.4

    "jbpm-jpdl-designer-nodeps-3.1.4" 是一个针对Jbpm工作流管理系统中的JPDL设计工具的无依赖版本,主要用于创建和编辑JPDL(Jbpm Process Definition Language)文件。该资源包含了该工具的详细文档、许可证协议以及...

    jbpm-jpdl-suite-3.2.GA.zip-3

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm-flow-builder-5.1.0.Final.jar

    jbpm-flow-builder-5.1.0.Final.jar jbpm5

    jbpm-jpdl-suite-3.2.GA.zip-5

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm的入门1--简单实例

    总的来说,jbpm是一个强大的工具,它使得业务流程的管理和自动化变得简单。通过这个简单的入门实例,你将了解到如何设计、部署和运行一个基本的jbpm流程。随着深入学习,你可以利用jbpm构建复杂的业务流程系统,适应...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    jbpm-3.1.2.zip 文件包含了 jBpm 的一个重要版本——jBpm 3.1.2,这是一个开源的工作流管理系统,专为构建灵活且可扩展的业务流程解决方案而设计。jBpm 提供了一种方式,使得开发者能够用简单而强大的语言来表达业务...

Global site tag (gtag.js) - Google Analytics