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

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

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

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

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

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

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


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

    posted on 2009-04-16 17:27 nighthawk 閱讀(2733) 評論(3)  編輯  收藏

    Feedback

    # re: 警惕手工加載spring配置文件導(dǎo)致數(shù)據(jù)庫session無法釋放[未登錄] 2009-04-17 11:11 gavin
    為什么每次都要加載一次配置文件?  回復(fù)  更多評論
      

    # re: 警惕手工加載spring配置文件導(dǎo)致數(shù)據(jù)庫session無法釋放 2009-04-17 16:02 空白
    集成ApplicationContextAware,獲取web環(huán)境中實例化的ApplicationContex,就可以獲取已經(jīng)實例化的bean;

    public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext arg0)
    throws BeansException {
    SpringContextUtil.applicationContext = arg0;
    }

    public static ApplicationContext getApplicationContext() {
    return SpringContextUtil.applicationContext;
    }

    /**
    * <p>根據(jù)名字獲取spring容器中bean</p>
    * @param name
    * @return
    */
    public static Object getBean(String name) {
    return SpringContextUtil.getApplicationContext().getBean(name);
    }
    }  回復(fù)  更多評論
      

    # re: 警惕手工加載spring配置文件導(dǎo)致數(shù)據(jù)庫session無法釋放 2010-03-19 23:01 plusir
    在找關(guān)于registerShutdownHook是否能在web環(huán)境下起作用的文章,隨機do到了你的blog。
    文章隨便點了點,沒有細看,但是只看標題,就仿佛看到了鏡子里另外一個自己。不知道你的重構(gòu)看完了沒,我的那本擺了好幾年了,始終是擺設(shè)。core j2ee patterns一直似看不看的翻著,也不知道后ejb時代這些東西是不是有價值,不過福勒的企業(yè)應(yīng)用架構(gòu)模式到是反過來調(diào)過去的看著。
    關(guān)注著j2ee,SSH,EJB3等等等等,同時思考著設(shè)計分析框架軟件過程那些東西,經(jīng)歷何其的相似??纯茨阕詈笠黄恼碌娜掌冢胂胱约耗蔷貌痪S護的blog,心里小小的酸楚了一下,輕輕的問候一聲,最近還好吧,我的同行 :)  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲精品456播放| 亚洲免费福利视频| 国产成人免费a在线视频app| 亚洲国产美女精品久久久久| 7x7x7x免费在线观看| 久久综合九九亚洲一区| baoyu777永久免费视频| 亚洲精品无码MV在线观看 | 亚洲一区AV无码少妇电影☆| 美女被免费视频网站| 波多野结衣一区二区免费视频| 精品在线观看免费| 亚洲国产成人久久精品99| www成人免费观看网站| 亚洲一区二区三区影院| 免费视频一区二区| 亚洲高清日韩精品第一区| 野花高清在线观看免费3中文 | 亚洲美国产亚洲AV| 日韩免费视频网站| 免费手机在线看片| 亚洲av成人无码久久精品| 日本免费xxxx| 国产成人精品亚洲| 亚洲中文字幕无码爆乳AV| 人妻无码一区二区三区免费| 亚洲天堂一区在线| 拍拍拍又黄又爽无挡视频免费| 中文字幕亚洲码在线| 在线免费不卡视频| www亚洲精品久久久乳| 免费国产真实迷j在线观看| 免费在线观看一区| 18禁美女裸体免费网站| 亚洲一区二区三区免费在线观看| 亚洲一区二区三区免费视频| 亚洲校园春色另类激情| 好先生在线观看免费播放| 国产免费一级高清淫曰本片| 亚洲AV无码久久寂寞少妇| 国产91色综合久久免费分享|