<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    OSWorkflow你讓我把數據庫關閉寫在哪里!

    Posted on 2006-03-02 21:02 killvin 閱讀(460) 評論(0)  編輯  收藏 所屬分類: osworkflow

    在Workflow事務回滾中遇到了問題,是這樣的

    DB2ConnectFactory 中getConn方法
    /**
    * 獲取數據庫連接
    * @return
    * @throws SQLException
    */
    public Connection getConn() throws SQLException
    {
    Object obj = threadLocal.get();
    if(obj == null)
    {
    this.initFactoryStack();
    }else
    {
    connect = (Connection)obj;
    }
    connect.setAutoCommit(false); //事務的回滾必須建立在將Commit狀態為False下,默認是true
    logger.debug("Get connect from factory - " + connect.hashCode());
    return connect;
    }

    AbstractWorkflow 的doAction()方法


    try {
    //transition the workflow, if it wasn't explicitly finished, check for an implicit finish
    if (!transitionWorkflow(entry, currentSteps, store, wf, action, transientVars, inputs, ps)) {
    checkImplicitFinish(id);
    }
    } catch (WorkflowException e) {
    context.setRollbackOnly(); // 這里調用WorkContext對象的setRollbackOnly()方法,執行事務的回滾
    throw e;
    }

    GearWheelWorkFlowContext 的setRollbackOnly方法
    /**
    * Tranaction : Set Roll back
    * @throws SQLException
    */
    public void setRollbackOnly()
    {
    logger.debug("Context execute setRollbackOnly() !!");
    Connection connect = null;
    try
    {
    DB2ConnectFactory factory = new DB2ConnectFactory();
    connect = factory.getConn();
    logger.debug("Context get connect " + connect.hashCode());

    if(connect != null) connect.rollback();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    finally
    {
    this.clostConnection(connect); //這里將關閉數據庫連接
    }
    }


    可是這是"異常"情況下的處理流程,如果正常執行呢?
    剛開始我想寫在CleanUp()方法里,但又一想不行,因為正常執行的流程需要做兩個工作
    1。將Commit狀態更新為true,并提交連接
    2。關閉數據庫連接


    關鍵就是關閉數據庫的連接在哪里寫?!現在寫在CleanUp()不合適,因為每一個WorkStore的方法都要默認(程序已經寫死了,我可不想重載它的所有的方法!!)的關閉數據庫連接!
    仔細的分析了一下,其實有兩個方法可以做到
    1。編寫Proxy類
    2。重載所有AbstractWorkflow中設計到事務的方法,(本來可以重載transitionWorkflow但是方法的類型卻為private?!)在它的方法下增加一個"提交"的方法。比如這樣

    try {
    //transition the workflow, if it wasn't explicitly finished, check for an implicit finish
    if (!transitionWorkflow(entry, currentSteps, store, wf, action, transientVars, inputs, ps))
    {
    checkImplicitFinish(id);
    }

    dosubmit();

    } catch (WorkflowException e) {
    context.setRollbackOnly(); // 這里調用WorkContext對象的setRollbackOnly()方法,執行事務的回滾
    throw e;
    }

    可以看到方法2比較"爛",看來下一步即使編寫方法1的實現


    主站蜘蛛池模板: 成全动漫视频在线观看免费高清版下载| 久久亚洲精品中文字幕| 亚洲高清毛片一区二区| 成年女人午夜毛片免费看| 亚洲一区二区影视| 噼里啪啦电影在线观看免费高清| 国产精品亚洲片在线va| 免费看AV毛片一区二区三区| 亚洲精品天堂成人片AV在线播放| 日本免费无遮挡吸乳视频电影| 男男gay做爽爽的视频免费| 亚洲国产av无码精品| 精品国产福利尤物免费| 色婷婷六月亚洲婷婷丁香| 国产在线jyzzjyzz免费麻豆| 亚洲а∨天堂久久精品9966 | 国产精品成人亚洲| 日本一道综合久久aⅴ免费| 日韩在线观看免费| 国产亚洲婷婷香蕉久久精品| 最近免费字幕中文大全视频| 在线亚洲午夜片AV大片| 婷婷综合缴情亚洲狠狠尤物| 在线看片免费人成视频久网下载 | 国产精品高清视亚洲精品| 国产精品久免费的黄网站| 国产免费高清69式视频在线观看| 久久久久亚洲av无码专区蜜芽 | 国产乱子精品免费视观看片| 国产精品亚洲色图| 亚洲AV无码专区电影在线观看| 国产va免费精品观看精品| 黄色a三级免费看| 久久久亚洲AV波多野结衣| 日本a级片免费看| 久久国产乱子伦精品免费不卡| 亚洲一区电影在线观看| 国产啪亚洲国产精品无码| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 国产成人高清精品免费鸭子| 成人无码a级毛片免费|