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

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

    博客分类:
  • JBPM
阅读更多
Spring, Springmodules, JBPM持久化集成--摆脱LazyInitializationException(Part1)

Spring, Springmodules, JBPM持久化集成理解系列三

【本系列如需转载,请注明作者及出处】

 

 

不管Jbpm的持久化策略如何,要重用Spring的持久化集成服务,我们要怎么做呢?Jbpm可以是B/S架构中的一部分,也可以是C/S架构的一部分。对于B/S架构,我们都知道有OpenSessionInViewFilter,然而C/S没有“Filter”,该从何入手呢?

  

我们先来看看OpenSessionInViewFilter是怎样做到的,本篇不讨论它的优缺点。OpenSessionInViewFilter也是一个javax.servlet.Filter,只不过它还是BeanNameAwareServletContextAwareInitializingBeanDisposableBean的实现。

  

像所有的Filter一样,Filter的入口都是

public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws ServletException, IOException;

 

到了OpenSessionInViewFilter这里,执行的方法就是

 

protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException;

  

 

 

doFilterInternal做的事情说简单也不简单,我们来看该方法做了什么,请留意注释:

protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		//1,	先把SessionFactory取出来。
		SessionFactory sessionFactory = lookupSessionFactory(request);
		boolean participate = false;

		//2.1	如果是设置了isSingleSession为true,则整个request请求中都会只使用一个session。
		if (isSingleSession()) {
			// single session mode
			//2.2 再看看当前线程是不是已经存在一个可用的session
			if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
				// Do not modify the Session: just set the participate flag.
				participate = true;
			}
			else {
				logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");
				//2.3	没有就创建一个
				Session session = getSession(sessionFactory);
				TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
			}
		}
		else {
			// deferred close mode
			//3.1 如果已经延迟关闭策略已经被激活,则什么事情也不做
			if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
				// Do not modify deferred close: just set the participate flag.
				participate = true;
			}
			else {
				//3.2  如果为false,则激活延迟关闭session策略
				SessionFactoryUtils.initDeferredClose(sessionFactory);
			}
		}

		try {
			filterChain.doFilter(request, response);
		}

		finally {
			//4.1,	filter返回后,如果在进入该filter之前延迟关闭已经被激活,该filter不负责关闭session,
			if (!participate) {
				if (isSingleSession()) {
					// single session mode
					SessionHolder sessionHolder =
							(SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
					logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter");
					closeSession(sessionHolder.getSession(), sessionFactory);
				}
				else {
					//4.2  如延迟关闭是该filter激活的,就在此关闭session
					// deferred close mode
					SessionFactoryUtils.processDeferredClose(sessionFactory);
				}
			}
		}
	}

  

isSingleSessionfalse时,也就是延迟关闭策略,应该有一部分会感到很奇怪了,并没有看到session的打开,这时就有必要要探讨一下了HibernateTemplateHibernateTemplate也是经典的回调模型,它的核心是execute方法。看到这段代码之后,是不是豁然开朗呢? 原来execute里一开始就将session取出来了,执行了callback之后就开始做session的管理了。注意HibernateTemplate里默认是allowCreate = true; alwaysUseNewSession = false;

public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
		Assert.notNull(action, "Callback object must not be null");

		Session session = getSession();
		/*
          *省略一段代码
*/
			Object result = action.doInHibernate(sessionToExpose);
		/*
          *省略一段代码
*/
		SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());

	}

SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());就像它字面要表达的,如果延迟关闭策略处于激活状态,则只是将session注册到一个容器里,到某个时刻再统一关闭,例如在OpenSessionInViewFilter返回时。

 

分享到:
评论

相关推荐

    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-workitems-5.1.0.Final-sources.jar

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

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

    jbpm-jpdl-suite-3.2.GA.zip

    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-suite-3.2.GA.zip-3

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm-jpdl-designer-nodeps-3.1.4

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

    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