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

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

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

    空間站

    北極心空

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    ?????????????????????????????????????????? 事務(wù)管理最佳實(shí)踐多余的話之一
    ????????????????????????????????????????? ? ----“每次請(qǐng)求,一次數(shù)據(jù)庫(kù)連接,一次事務(wù)”是不是金科玉律?
    前言
    《事務(wù)管理最佳實(shí)踐多余的話之一》,不知道會(huì)不會(huì)還有之二、之三。
    ?
    “每次請(qǐng)求,一次數(shù)據(jù)庫(kù)連接,一次事務(wù)”是不是金科玉律?
    “每次請(qǐng)求,一次數(shù)據(jù)庫(kù)連接,一次事務(wù)”,這只是一個(gè)大體的原則,表示我們的數(shù)據(jù)庫(kù)連接和事務(wù)在一個(gè)請(qǐng)求的范圍內(nèi),應(yīng)該盡可能得長(zhǎng)。并不是一定要你遵循這個(gè)原則。所有的原則、理論,只是指導(dǎo)你工作的思想武器,決不是約束你的條條框框。面對(duì)具體情況,你可以靈活處理。
    完全可以這樣做:“每次請(qǐng)求,多次數(shù)據(jù)庫(kù)連接,多次事務(wù)”。
    請(qǐng)看下面這個(gè)例子:
    ?
    一、這是SpringMVC的一個(gè)控制器的方法
    前臺(tái)頁(yè)面上是一個(gè)多選框,選中多個(gè)要?jiǎng)h除的工作流。傳遞的參數(shù),是各個(gè)工作流的名字。
    這里,在循環(huán)中調(diào)用服務(wù)類的Transaction方法:uninstallJbpmProcessDefinitionsTransaction(names[i])
    卸載Jbpm的業(yè)務(wù)程序定義,及其全部實(shí)例、任務(wù)。
    /**
    ?????*刪除該頁(yè)選中的業(yè)務(wù)程序定義
    ?????*@paramrequest
    ?????*@paramresponse
    ?????*
    @return
    ?????*@throwsException
    ?????
    */
    ????
    public?ModelAndView?uninstall(HttpServletRequest?request,HttpServletResponse?response,ProcessDefinitionNames?command)?throws?Exception{
    ????
    /**
    ?????*1,選中的工作流名字。
    ?????
    */
    ????String[]?names
    =command.getNames();
    ????
    for(int?i=0;i<names.length;i++){
    ????????
    this.getUninstallProcessDefinition().uninstallJbpmProcessDefinitionsTransaction(names[i]);
    ????????
    ????}
    ????
    ???????
    ???????returnnew?ModelAndView(UrlMap.map(
    "manage.uninstallProcessDefinition.uninstall"));
    ????}
    ?

    二、這是服務(wù)類的相關(guān)方法
    (一)這是服務(wù)類的Transaction方法。創(chuàng)建和關(guān)閉了Hibernate的Session,同時(shí)也處理了事務(wù)。

    /*?(non-Javadoc)
    ?????*?@see?com.withub.common.util.IUninstallProcessDefinition#uninstallJbpmProcessDefinitionsTransaction(java.lang.String)
    ?????
    */
    ?????publicvoid?uninstallJbpmProcessDefinitionsTransaction(String?name){
    ????????JbpmContext?jbpmContext?
    =?JbpmConfiguration.getInstance().createJbpmContext();
    ???????????
    try?{
    ???????????
    ???????????
    this.uninstallJbpmProcessDefinitionsDao(name);
    ????????????????????
    ???????????}
    finally{
    ???????????jbpmContext.close();
    ???????????
    ???????????}
    ????????
    ?????}
    (二)這是具體使用Hibernate的數(shù)據(jù)訪問(wèn)方法,執(zhí)行卸載業(yè)務(wù)程序定義的方法。
    控制器層不能直接調(diào)用它,因?yàn)樗鼪](méi)有提供處理“得到和關(guān)閉數(shù)據(jù)庫(kù)連接,管理事務(wù)”任務(wù)的代碼。

    /**
    ?????*
    ?????*@paramname
    ?????
    */
    ????privatevoid?uninstallJbpmProcessDefinitionsDao(String?name){
    ???????JbpmContext?jbpmContext?
    =?JbpmConfiguration.getInstance().getCurrentJbpmContext();
    ???????GraphSession?graphSession
    =jbpmContext.getGraphSession();
    ????????List?processDefinitions
    =graphSession.findAllProcessDefinitionVersions(name);
    ????????
    if(processDefinitions!=null){
    ????????Iterator?iterator
    =processDefinitions.iterator();
    ?????????
    while(iterator.hasNext()){
    ?????????????
    ?????????????graphSession.deleteProcessDefinition((ProcessDefinition)iterator.next());
    ????????}
    ????????
    ????????
    ????????}
    ????????log.info(
    "卸載工作流:"+name);
    ????}

    例子解析
    上面這個(gè)例子中,控制器中,每一次循環(huán),都重復(fù)執(zhí)行了“得到和關(guān)閉數(shù)據(jù)庫(kù)連接,管理事務(wù)”的代碼。因此,違背了“每次請(qǐng)求,一次數(shù)據(jù)庫(kù)連接,一次事務(wù)”的原則。
    依照這個(gè)原則,我們需要在服務(wù)類中重新寫一個(gè)Transaction方法,把所有循環(huán)放在try塊中。只使用一個(gè)數(shù)據(jù)庫(kù)連接和事務(wù)。
    這樣做,當(dāng)然可以。但是,上面的代碼也沒(méi)有什么問(wèn)題。如果在控制器方法執(zhí)行過(guò)程中,發(fā)生異常,那么可能有的Jbpm工作流定義(我叫它們?yōu)椤皹I(yè)務(wù)程序定義”)被卸載了,有的沒(méi)有被卸載。但是,這不會(huì)破壞數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性和正確性。
    上面這段代碼,唯一的問(wèn)題是,數(shù)據(jù)庫(kù)連接的獲取和關(guān)閉太頻繁。但是,根據(jù)這個(gè)控制器方法的業(yè)務(wù)邏輯,我們知道,這個(gè)循環(huán)并不會(huì)太大。因?yàn)椋遁d的業(yè)務(wù)程序定義不可能很多。而且,這個(gè)功能的前臺(tái)頁(yè)面是分頁(yè)的,因此,不會(huì)一次卸載太多的業(yè)務(wù)程序定義。所以,這個(gè)問(wèn)題并不是很嚴(yán)重。
    既然如此,基于實(shí)用主義的原則,我不打算修改上面的代碼。這樣,我就減少了編寫一個(gè)Service類的Transaction方法的麻煩。現(xiàn)在使用的這個(gè)Transaction方法是原來(lái)就開(kāi)發(fā)好的。(為了一個(gè)命令行卸載工具開(kāi)發(fā)的)
    ?
    結(jié)語(yǔ)
    這篇“多余的話”,就是希望讀者不要走極端。在理想主義和現(xiàn)實(shí)情況之間,我們應(yīng)該用現(xiàn)實(shí)主義的方法來(lái)看待問(wèn)題,解決問(wèn)題。“不管白貓黑貓,抓住老鼠就是好貓”!當(dāng)然,在現(xiàn)實(shí)生活中,我還是希望你能夠想得更深一點(diǎn),永遠(yuǎn)保持“精益求精”的精神,多問(wèn)問(wèn)為什么,怎樣才能做得更好。這樣,才能有助于你進(jìn)一步提高。
    我記得《代碼大全》的作者Steve McConnell,曾經(jīng)說(shuō)過(guò)(我不記得原話了,大概就是下面我說(shuō)的這個(gè)意思):一個(gè)程序員的能夠達(dá)到的成就,從他從業(yè)的第一年就可以看出來(lái)。一個(gè)程序員,在從業(yè)一年之后,應(yīng)該已經(jīng)可以勝任大部分工作。如果他不再追求更好的編碼,只是得過(guò)且過(guò),吃老本,那么這個(gè)程序員不管從業(yè)多少年,永遠(yuǎn)只是菜鳥級(jí)的。如果一個(gè)程序員,在從業(yè)兩年之后,依然保持著旺盛的求知欲,那么他的前途將是無(wú)可限量的!
    希望你是后者,當(dāng)然,如果你想轉(zhuǎn)作管理,那么選擇作前者,你的“錢途”更加光明!
    ?
    ?


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1417657

    posted on 2006-12-02 17:10 蘆葦 閱讀(557) 評(píng)論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 亚洲欧美在线x视频| 男人的天堂亚洲一区二区三区| 亚洲大尺度无码无码专线一区| 亚洲AV无码一区东京热久久| 亚洲成AⅤ人影院在线观看| 国产情侣激情在线视频免费看| 免费在线黄色电影| 一级毛片成人免费看a| 国产精品亚洲va在线观看| 色偷偷女男人的天堂亚洲网| 亚洲av日韩av无码| 日本亚洲成高清一区二区三区 | 亚洲乱码在线视频| 久久亚洲伊人中字综合精品| 亚洲女久久久噜噜噜熟女| heyzo亚洲精品日韩| 国产又黄又爽又刺激的免费网址 | 日本不卡视频免费| 男人的好看免费观看在线视频| 24小时日本电影免费看| 久久精品免费视频观看| 野花香高清在线观看视频播放免费| 一级毛片在线完整免费观看| 瑟瑟网站免费网站入口| 免费人成在线观看播放a| 阿v视频免费在线观看| 相泽南亚洲一区二区在线播放| 亚洲AV无码专区亚洲AV桃| 亚洲色大成WWW亚洲女子| 亚洲精品无码久久久久秋霞| 亚洲kkk4444在线观看| 亚洲最大天堂无码精品区| 国产精品亚洲四区在线观看 | 免费国产黄线在线观看| 99精品全国免费观看视频| 成年女人免费视频播放77777| A级毛片内射免费视频| 国产美女被遭强高潮免费网站 | 激情小说亚洲色图| 草久免费在线观看网站| h在线看免费视频网站男男|