ApplicationContext對象的擷取方式

來源:互聯網
上載者:User

標籤:資料庫連接   spring   個人簡曆   status   

    本來這是一個比較簡單的問題。

    然而在前一段事件項目中出現了一個問題。

    問題描述:資料庫連接數只增不減,直到資料庫連結數爆滿,報了一個 too many connection異常。整個服務就掛了,需要重寫啟動一次才能使用。

    一開始的時候,一直以為是dao層那個連結沒有釋放。把dao層的代碼都查了一遍,也從網上搜尋了很多關於資料庫連接池的東西,但是也沒有發現問題。於是就糾結了~~

    後台通過mysql的一個命令,status,發現在求職者簡曆編輯模組,每編輯一次簡曆,資料庫連接數就會只增不減,增加三個(這個數與資料庫連接池的一個參數有關,用的是dbcp連結池),於是就又把簡曆編輯模組的內容檢查了一遍,終於找到了罪魁禍首。

    在簡曆編輯的時候,為了重建個人簡曆的靜態頁面,使用了freemarker。但是freemarker模組的業務層沒有使用@Resource,將它交給spring容器來管理。在裡面有一行代碼為了擷取到某個dao層的bean,使用了

    ApplicationContext ac = new ClassPathXmlApplicationContext(File file);

    ac.getBean(Class clazz);

這句代碼,相信很多人,看到這句代碼就已經大致猜到了問題的所在了。

    ApplicationContext ac = new ClassPathXmlApplicationContext(File file),這句代碼相當於又重新初始化了一遍Spring容器。So......‘

    問題算是解決了,那麼總結一下經驗教訓。到底該如何正確的擷取到bean呢?

     1、一般情況下,我們使用spring容器來管理bean,可以直接使用注入的方式來擷取到bean

     例如:使用@Resource,@Autowire.

    2、如果沒有將某個bean交給spring容器來管理,我們又該在web項目中如果擷取到這個bean呢?

    方式一:也是錯誤的方式,就是使用

        ApplicationContext ac = new ClassPathXmlApplicationContext(File file);

        ac.getBean(Class clazz);

        這種方式的弊端就如上所述,一般用於單元測試,不能在web項目中直接使用。

    方式二:使用

        ApplicationContext ac1 = WebApplicationContextUtils.

                                        getRequiredWebApplicationContext(ServletContext sc)
                          ApplicationContext ac2 = WebApplicationContextUtils.

                                        getWebApplicationContext(ServletContext sc)
                          ac1.getBean(beanId);
                          ac2.getBean(beanId);說明:

                               這種方式適合於採用Spring架構的B/S系統,通過ServletContext對象擷取ApplicationContext對象,然後在通過它擷取需要的類執行個體。

                              說明:上面兩個工具方式的區別是,前者在擷取失敗時拋出異常,後者返回null。

            這幾種方式可能使我們比較常用到的。至於其他的方式,請參考

            http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html    星星索深邃的部落格。

    

    


本文出自 “不羈的風” 部落格,請務必保留此出處http://fengcl.blog.51cto.com/9961331/1745777

ApplicationContext對象的擷取方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.