`
midstr
  • 浏览: 33238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工作流jbpm3.1.2导致数据库连接池满的问题

阅读更多
背景: 
    XX系统实施一段时间之后,出现数据连接池满,第一次通过修改if(con!=null && con.isClosed()){con.close();}这样的逻辑错误解决部分问题。第二次通过彻底复查代码,修改了connection、session没有释放的问题,基本上保证我们自己写的代码没有数据库连接不释放的问题。但是临近近期还是出现连接池满的问题。。。

过程:
    从日志看,除了有大量工作流报错之外程序很少有异常,类似如下:
引用:
2009-06-12 15:44:34,187 [http-80-Processor44] [org.hibernate.event.def.AbstractFlushingEventListener] [ERROR] - Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.jbpm.graph.exe.Token#35000000000033432]
         ..............................................
        at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:180)
         ..............................................
2009-06-12 15:44:34,187 [http-80-Processor44] [org.jbpm.svc.Services] [ERROR] - problem closing service 'persistence'
org.jbpm.persistence.JbpmPersistenceException: couldn't flush hibernate session
        at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:182)

Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.jbpm.graph.exe.Token#35000000000033432]
        at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:180)
        ... 54 more
最开始基本确定了是工作流报错导致数据库连接池不释放,理由:
        a、上面的错和hibernate的session有关
        b、在sybase执行sp_who发现大量不释放连接所占用的库为DB_LC,而这个库就是工作流相关的库。
        c、从sybase的sysprocesses表查看,不释放连接是每天新增10-30不等,随机统计了日志某天的如前所述的异常为27个,而从数据库端统计该天新增连接也是27个。
     因为自己对工作流不熟悉,所以每次都是把情况反映给相关人员处理。前几天去客户现场正好抓取了一下不释放连接正在执行的sql,基本都是乱码,如下:
引用:
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
SQL Text: !
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
(1 row affected)
47
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
SQL Text: *
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
(1 row affected)
49
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
SQL Text:
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
(1 row affected)
这个结果用处不大,很好奇这个问题,所以找了一份工作流的源码,找到报错的类DbPersistenceService.close方法,如下:
复制内容到剪贴板
代码:
public void close() {
    if ( (session!=null)
         && (transaction==null)
         && (isRollbackOnly)
       ) {
      throw new JbpmException("setRollbackOnly was invoked while configuration specifies user managed transactions");
    }
    if (messagingSession!=null) {
      messagingSession.closeOpenIterators();
    }
    if (schedulerSession!=null) {
      schedulerSession.closeOpenIterators();
    }
    if ( (isTransactionEnabled)
         && (transaction!=null)
       ) {
      if (isRollbackOnly) {
        try {
          log.debug("rolling back hibernate transaction");
          mustSessionBeFlushed = false; // flushing updates that will be rolled back is not very clever :-)
          transaction.rollback();
        } catch (Exception e) {
          throw new JbpmPersistenceException("couldn't rollback hibernate session", e);
        }
      } else {
        try {
          log.debug("committing hibernate transaction");
          mustSessionBeFlushed = false; // commit does a flush anyway
          transaction.commit();
        } catch (Exception e) {
          try {
            // if the commit fails, we must do a rollback
            transaction.rollback();
          } catch (Exception e2) {
            // if the rollback fails, we did what we could and you're in
            // deep shit :-(
            log.error("problem rolling back after failed commit", e2);
          }
          throw new JbpmPersistenceException("couldn't commit hibernate session", e);
        }
      }
    }
   
    if (mustSessionBeFlushed) {
      try {
        log.debug("flushing hibernate session");
        session.flush();
      } catch (Exception e) {
        throw new JbpmPersistenceException("couldn't flush hibernate session", e);
      }
    }   
    if (mustSessionBeClosed) {
      try {
        log.debug("closing hibernate session");
        session.close();
      } catch (Exception e) {
        throw new JbpmPersistenceException("couldn't close hibernate session", e);
      }
    }

    if (mustConnectionBeClosed) {
      try {
        log.debug("closing jdbc connection");
        connection.close();
      } catch (Exception e) {
        throw new JbpmPersistenceException("couldn't close jdbc connection", e);
      }
    }
  }
一看真是吓一跳,程序在执行到session.flush();时候报错的话,如果mustSessionBeClosed为true根本不能执行到后面的session.close(),会导致数据库连接不释放的问题……基本确定问题所在了,就在本地试着复现一下问题(因为前面所描述的异常在开发环境无法复现,所以只能强制在flush后抛异常),果然不出意料。
     因为这个是jbpm3.1.2版本,觉得应该是jbpm的bug吧,就又下载了一份jbpm3.3.0GA源码,找到DbPersistenceService.close()方法:
复制内容到剪贴板
代码:
  public void close() {

    if ( (session!=null)
         && !isTransactionActive()
         && (isRollbackOnly())
       ) {
      throw new JbpmException("setRollbackOnly was invoked while configuration specifies user managed transactions");
    }
   
    if ( (isTransactionEnabled)
         && (transaction!=null)
       ) {

      if (! isRollbackOnly()) {
        Exception commitException = commit();
        if (commitException!=null) {
          rollback();
          closeSession();
          closeConnection();
          throw new JbpmPersistenceException("hibernate commit failed", commitException);
        }

      } else { // isRollbackOnly==true
        Exception rollbackException = rollback();
        if (rollbackException!=null) {
          closeSession();
          closeConnection();
          throw new JbpmPersistenceException("hibernate rollback failed", rollbackException);
        }
      }
    }
   
    Exception flushException = flushSession();
    if (flushException!=null) {
      // JBPM-1465 transaction has been either committed or rolled back at this point
      // on the other hand, it is possible that no transaction is underway
      // hence rolling back here is redundant and possibly dangerous
      closeSession();
      closeConnection();
      throw new JbpmPersistenceException("hibernate flush failed", flushException);
    }
    Exception closeSessionException = closeSession();
    if (closeSessionException!=null) {
      closeConnection();
      throw new JbpmPersistenceException("hibernate close session failed", closeSessionException);
    }
    Exception closeConnectionException = closeConnection();
    if (closeConnectionException!=null) {
      throw new JbpmPersistenceException("hibernate close connection failed", closeConnectionException);
    }
  }
果然在3.3.0版本中,当flush、close等操作出现异常时候,都会调用closeSession()和closeConnection()以保证连接正常释放。照猫画虎在该方法写了关闭session和connection的方法,准备月底发布新版本试试。

结论:
   XX系统工作流jbpm3.1.2存在连接不释放的bug,当然前提是程序执行数据库操作报错的情况下(如session.flush)。虽然解决了连接不释放的问题,但是这个关于这个报错的深层原因还没搞清楚。另外和相关人员确认,工作流的这些异常可以cacth掉,到目前为止除了引起连接不释放之外,没有发现其他问题。
分享到:
评论

相关推荐

    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 提供了一种方式,使得开发者能够用简单而强大的语言来表达业务...

    jbpm3.1.2_webapp

    【jbpm3.1.2_webapp】是一个基于Java的企业级工作流管理系统,它结合了业务流程管理和任务管理的功能,为企业提供了一套完整的流程自动化解决方案。这个版本的jbpm是针对Web应用程序设计的,因此包含了所有必要的Web...

    JBPM -3.1.2 相关WEb 开发JAR

    JBPM(Java Business Process Management)是一款开源的工作流管理系统,它提供了完整的业务流程管理解决方案,包括流程设计、执行、监控以及管理工作流实例。JBPM 3.1.2是该系统的一个较早版本,但在当时已经具备了...

    jbpm连接mysql数据库的实例以及问题解决方案

    本篇将详细讲解如何将JBPM与MySQL数据库进行连接,并解决可能遇到的问题。 首先,让我们了解JBPM与MySQL的集成。JBPM需要一个持久化存储来保存工作流实例、任务、变量等信息,而MySQL是一个常用的数据库管理系统,...

    JBPM修改数据库教程以及实例

    JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行业务流程。在JBPM6中,默认使用H2内存数据库进行存储,但实际生产环境中,我们通常会选择更为稳定且功能强大的MySQL或...

    jbpm-webapp-3.1.2.jar

    jbpm-webapp-3.1.2.jar

    工作流JBPM开发计划书

    ### 工作流JBPM开发计划书 #### 一、项目背景与目标 在当前数字化转型的大背景下,企业越来越依赖于高效的工作流程管理来提升业务效率和服务质量。JBPM(JBoss流程管理)作为一款开源的工作流引擎,因其灵活性、可...

    jbpm-3.1.2.jar

    jbpm-3.1.2.jar jar jbpm

    JBPM4.4 mysql数据库创建脚本

    JBPM4.4 mysql数据库创建脚本,修正ant create.jbpm.schema不能创建数据库的bug。

    工作流jbpm应用的实例

    工作流jbpm应用实例解析 工作流jbpm(Java Business Process Management)是一种开源的工作流管理系统,主要用于设计、执行和管理业务流程。jbpm是基于Java技术的,它提供了丰富的API和图形化工具,使得开发者可以...

    工作流引擎jbpm学习笔记

    工作流引擎jbpm学习笔记 jbpm是一个专业的工作流引擎,用于定义、管理和执行业务流程。它可以帮助我们简化工作流程的开发和维护,提高工作效率和可扩展性。 一、什么是公文流转? 公文流转是指公文在定义流转中的...

    jbpm数据库表介绍

    jbpm 数据库表介绍 jbpm 是一个基于 Java 的 workflow 引擎,用于管理和执行业务流程。jbpm 需要持久化流程部署、流程实例、任务、用户认证等信息,于是 jbpm 设计了一系列的数据库表来存储这些信息。在 jbpm 4.4 ...

    有关工作流jbpm概述(5)

    工作流jbpm是一个开源的工作流引擎,主要用于设计、执行和管理业务流程。本文将深入探讨工作流的概念,jbpm的特点,以及它在实际业务场景中的应用。 首先,工作流起源于生产组织和办公自动化领域,旨在通过将工作...

    jbpm工作流整合

    jbpm工作流整合是一个关键的主题,它涉及到企业级业务流程管理(BPM)系统的实施与集成。jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和框架,用于设计、执行、监控和优化业务流程。这个压缩包可能包含...

    eclipse工作流插件 含jBPM_4.4_开发指南

    本指南将深入探讨如何利用Eclipse与jBPM 4.4版本相结合,实现高效的工作流应用开发。 首先,我们要理解jBPM是什么。jBPM是一个开源的工作流管理系统,它提供了对业务流程建模、执行和监控的全面支持。jBPM 4.4是其...

    Activiti5 jbpm 工作流 数据库 表结构.docx

    Activiti和jBPM是两个流行的工作流管理系统,它们用于自动化业务流程。这些系统与数据库紧密集成,通过一系列特定的表来存储流程定义、执行、历史数据等信息。以下是关于这些数据库表结构的详细说明: 1. **ACT_GE_...

    工作流JBPM中文开发指南

    【JBPM工作流开发指南】是一本专注于介绍JBPM(Java Business Process Management)的书籍,旨在帮助开发者理解和应用这一强大的工作流管理系统。JBPM是一种开源的业务流程管理系统,它允许组织设计、部署和执行复杂...

    jbpm创建数据库jbpm创建数据库

    JBPM是JBoss流程管理器(JBoss Business Process Management)的简称,这是一个开源的工作流引擎,用于自动化业务流程的执行。JBPM基于Java语言开发,并且支持BPMN2标准,这意味着它可以用来构建复杂而灵活的业务流程...

    jbpm4.4 DB2数据库脚本

    jbpm4.4 DB2数据库脚本,可直接执行sql脚本,创建jbpm4.4 数据库表

    请假工作流JBPM整合SSH2完整实例

    【标题】"请假工作流JBPM整合SSH2完整实例"涉及了多个IT领域的关键技术,主要集中在企业级应用开发上。JBPM(Java Business Process Management)是用于业务流程管理的开源框架,而SSH2则指的是Spring、Struts和...

Global site tag (gtag.js) - Google Analytics