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

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

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

    積累,創造,分享!

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

    2009年4月16日 #

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

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


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

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

    主站蜘蛛池模板: 最新猫咪www免费人成| 精品国产麻豆免费人成网站| 成年人网站免费视频| 久久久久久亚洲精品成人| 一个人看的www免费视频在线观看| 综合亚洲伊人午夜网 | 亚洲一区日韩高清中文字幕亚洲| 亚洲美国产亚洲AV| 亚洲第一成年免费网站| 亚洲日韩中文字幕一区| 成人毛片18女人毛片免费视频未| 亚洲人成网站在线播放2019| 国产免费变态视频网址网站| 免费在线观看自拍性爱视频| 中文字幕第一页亚洲| 国产无遮挡裸体免费视频在线观看 | 四虎永久在线精品免费一区二区| 亚洲av午夜成人片精品电影| 一区二区在线免费视频| 久久久久亚洲AV成人无码网站 | 亚洲欧美日本韩国| 免费a级毛片大学生免费观看 | 一级一级毛片免费播放| 亚洲av一综合av一区| 91成年人免费视频| 在线观看免费亚洲| 亚洲精品无码午夜福利中文字幕 | 久久免费国产视频| 久久精品国产亚洲αv忘忧草| 国产无遮挡吃胸膜奶免费看视频| 深夜免费在线视频| 亚洲精品白色在线发布| 黑人粗长大战亚洲女2021国产精品成人免费视频| 亚洲AV无码成人精品区日韩| 亚洲精品夜夜夜妓女网| 国产免费久久精品99re丫y| 一级做a爰片性色毛片免费网站 | 国产日韩精品无码区免费专区国产| 亚洲AV综合色区无码另类小说| 久久不见久久见中文字幕免费| WWW国产成人免费观看视频|