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

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

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

    積累,創(chuàng)造,分享!

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      25 Posts :: 13 Stories :: 26 Comments :: 0 Trackbacks

    2008年3月23日 #

    問(wèn)題現(xiàn)象:在做web應(yīng)用時(shí)會(huì)碰到這種情況,某些地方無(wú)法通過(guò)web當(dāng)中的ApplicationContext來(lái)獲得springIOC容器提供的bean,比如提供給外界的webservice接口,這個(gè)時(shí)候就需要手工通過(guò)ClassPathXmlApplicationContext等方式來(lái)獲取ApplicationContext,代碼如下:
    ApplicationContext context = new ClassPathXmlApplicationContext(
        "applicationContext-*.xml");
    IXXXService xxxservice = (IXXXService ) context
        .getBean("xxxservice ");
    這是一段很典型的加載。
    然而,正是這種看似到處都是的加載卻為后面的BUG埋下伏筆。
    xxxservice是具體的業(yè)務(wù)類,它向下與DAO依賴并控制著事務(wù),這里代表了一個(gè)經(jīng)典而且簡(jiǎn)單的service,具體配置略去,值得一提的是scope,這里沒(méi)有指定,默認(rèn)的是單例。
    一切都是那么順利,像這樣的service代碼寫的應(yīng)該不下幾百個(gè),可能諸位寫的更多,過(guò)程依然很陶醉,修改完畢。測(cè)試,再測(cè)試。什么?ORA-12519錯(cuò)誤!見(jiàn)鬼,我打造的這套號(hào)稱簡(jiǎn)易快速的SSH2框架已經(jīng)在多個(gè)項(xiàng)目好評(píng)無(wú)數(shù)久經(jīng)考驗(yàn)了,寫了不下幾百次的service居然報(bào)ORA-12519錯(cuò)誤。
    迅速打開(kāi)PLSQL,檢查數(shù)據(jù)庫(kù)session,Select Count(1) From v$session t Where t.SCHEMANAME='XXX';
    隨著service的執(zhí)行,session數(shù)在增加,沒(méi)有減少的意思。是的,當(dāng)時(shí)就是這樣。

    解決思路:這種錯(cuò)誤出現(xiàn)在久經(jīng)考驗(yàn)的框架當(dāng)中,我心里是相當(dāng)不安的,居然會(huì)有這種低級(jí)趣味的錯(cuò)誤。整理思路開(kāi)始分析:這段代碼唯一與以前不同的地方就是,我們?cè)趙eb應(yīng)用中,是通過(guò)容器加載提供bean的,只有容器啟動(dòng)的時(shí)候才會(huì)加載xml。那么重點(diǎn)就應(yīng)該是關(guān)注XML的加載方式了。
    在這里我們用的是ApplicationContext接口。注意看spring文檔3.5.1.2.2 在非web應(yīng)用中優(yōu)雅地關(guān)閉springioc容器。它這里用到的是AbstractApplicationContext,在取得bean后,再執(zhí)行一個(gè)context.registerShutdownHook();
    這里實(shí)驗(yàn)一把,將ApplicationContext改成AbstractApplicationContext,執(zhí)行context.close()。結(jié)果出來(lái)了,session已被正常回收,真相漸漸浮出水面。


    結(jié)論:每次加載context的做法相當(dāng)于每次都生成了一次新的spring容器,在默認(rèn)單例的情況下,如果不及時(shí)關(guān)閉context。service所依賴的DAO當(dāng)中創(chuàng)建的dataSource也一直存在(包括所有的單例情況下所生成的類),從日志看,service事務(wù)管轄中的session確實(shí)已經(jīng)關(guān)閉,但SessionFactory還是存在的。只有在容器關(guān)閉的情況下,并指定了dataSource實(shí)例配置中的destroy-method="close",dataSource單例才會(huì)被釋放。
    spring文檔當(dāng)中對(duì)生命周期也描述的很清楚。通過(guò)DisposableBean或者指定destroy-method都能很好的釋放單例對(duì)象。而prototype類型的對(duì)象需要客戶端顯式的指定釋放,釋放對(duì)象完全是客戶端控制,spring不負(fù)責(zé)釋放。
    所以,要改善context的加載方式,盡量的少多次去加載,實(shí)在沒(méi)辦法的情況下,一定要記得關(guān)閉。
    最后,寫代碼的隨意性,圖省事,不經(jīng)思考,是造成這種BUG的罪惡根源。

    posted @ 2009-04-16 17:27 nighthawk 閱讀(2733) | 評(píng)論 (3)編輯 收藏

         摘要: 關(guān)注領(lǐng)域模型有一段時(shí)間了,不論是分析階段的還是設(shè)計(jì)階段的。
    其實(shí)領(lǐng)域模型的概念很早就有了,但是其概念非常容易被人混淆,首先我們要明確一下這個(gè)詞的語(yǔ)境:
    它在軟件開(kāi)發(fā)的分析與設(shè)計(jì)的兩個(gè)階段分別代表不同的含義。
      閱讀全文
    posted @ 2008-03-23 00:01 nighthawk 閱讀(1652) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲精品国产字幕久久不卡| 国产中文字幕免费观看| 亚洲国产成人高清在线观看| 一个人看www免费高清字幕| 亚洲精品国产自在久久| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲AV伊人久久青青草原| 爱情岛论坛免费视频| 亚洲?v女人的天堂在线观看| eeuss免费天堂影院| 亚洲精品蜜桃久久久久久| 99久久久国产精品免费蜜臀| 亚洲乱码一区av春药高潮| 思思99re66在线精品免费观看| 国产亚洲精品91| 亚洲国产精品成人久久 | 午夜免费福利在线| 国产亚洲精品成人久久网站| 国产av无码专区亚洲国产精品| 国内精品免费视频精选在线观看| 91亚洲国产成人精品下载| 好男人www免费高清视频在线| 美女视频黄视大全视频免费的| 久久亚洲精品无码观看不卡| 久久免费观看国产99精品| avtt天堂网手机版亚洲| 波多野结衣中文一区二区免费| 中国国产高清免费av片| 亚洲宅男天堂a在线| 婷婷综合缴情亚洲狠狠尤物| 精品成人免费自拍视频| 午夜在线a亚洲v天堂网2019| 亚洲国产人成精品| 亚洲免费黄色网址| 日本一区二区在线免费观看| 亚洲精品资源在线| 久久久久无码专区亚洲av| 国产桃色在线成免费视频| a级毛片免费观看网站| 亚洲无线一二三四区| 亚洲一级黄色视频|