<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的實現


    主站蜘蛛池模板: 男人免费视频一区二区在线观看| CAOPORN国产精品免费视频| 国产亚洲精品影视在线| 免费中文字幕视频| 免费a级毛片永久免费| 亚洲国产综合在线| baoyu116.永久免费视频| 日本人护士免费xxxx视频| 亚洲最大的成网4438| 一出一进一爽一粗一大视频免费的| 免费观看激色视频网站(性色) | av免费不卡国产观看| 中文亚洲AV片不卡在线观看| 日本亚洲色大成网站www久久| 最近免费中文字幕大全视频| 亚洲国产成人私人影院| 一级女性全黄生活片免费看| 中文字幕中韩乱码亚洲大片| 亚洲日韩在线中文字幕综合| 91在线视频免费播放| 久久精品国产亚洲av麻豆小说| 亚州免费一级毛片| 亚洲.国产.欧美一区二区三区| 在线观看av永久免费| 色噜噜噜噜亚洲第一| 亚洲综合色自拍一区| 67194熟妇在线永久免费观看| 亚洲日韩精品国产3区| 永久免费av无码网站韩国毛片| 亚洲色偷精品一区二区三区| AV免费网址在线观看| 亚洲一区二区久久| 国产人成免费视频网站| 亚洲av无码一区二区三区四区| 亚洲一区二区三区在线观看精品中文| 一级A毛片免费观看久久精品 | 在线观看日本亚洲一区| 国产亚洲精品国看不卡| 最近免费中文字幕大全高清大全1| 亚洲AV一宅男色影视| 久久免费视频99|