<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 閱讀(467) 評論(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的方法都要默認(程序已經寫死了,我可不想重載它的所有的方法?。。┑年P閉數據庫連接!
    仔細的分析了一下,其實有兩個方法可以做到
    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的實現


    主站蜘蛛池模板: 免费毛片网站在线观看| 老司机免费午夜精品视频| 一级做a爰片久久毛片免费陪| 亚洲成年人免费网站| 亚洲一区爱区精品无码| 无遮挡a级毛片免费看| 黄a大片av永久免费| 亚洲一本到无码av中文字幕| 日韩免费电影网址| 亚洲色偷偷偷鲁综合| 中国一级特黄的片子免费 | 免费无码午夜福利片69| 久久久受www免费人成| 又粗又大又硬又爽的免费视频 | 99re视频精品全部免费| 久久精品国产亚洲夜色AV网站| 国产精品免费久久久久影院| 亚洲一级特黄大片无码毛片| 精精国产www视频在线观看免费| 亚洲国产高清在线一区二区三区| 一区二区三区免费电影| 亚洲国产精品无码专区在线观看| 久久久99精品免费观看| 亚洲一卡2卡3卡4卡国产网站| 成人看的午夜免费毛片| 窝窝影视午夜看片免费| 国产精品亚洲аv无码播放| 永久在线观看www免费视频| 亚洲午夜一区二区三区| 亚洲人成色7777在线观看不卡 | 亚洲国产精品综合一区在线| 免费看大美女大黄大色| 久久免费观看视频| 亚洲成人激情小说| 亚洲中文字幕无码一区二区三区| 最近中文字幕mv免费高清在线| 亚洲aⅴ无码专区在线观看| 亚洲国产精品福利片在线观看| 女人张开腿等男人桶免费视频| 国产乱子伦精品免费视频| 亚洲第一成年网站大全亚洲|