<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

    2007年7月9日 #

    問題現象:在做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已被正?;厥眨嫦酀u漸浮出水面。


    結論:每次加載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)編輯 收藏

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

    至于docbook的好處,我也不多說了,就跟吃菜一樣,嘗過了就知道到底有幾好
    趁目前有空,部門內部準備補充一下之前缺乏的技術文檔。利用這次機會,我再次收想到了docbook。
    記得第一次接觸docbook的時候,還是3年前的時候了,可惜那個時候沒有堅持使用下來。
    當初拋棄它的原因是多方面的,缺乏恒心是一方面,配置煩瑣也是一方面,另外還有一個很重要的原因就

    是缺乏一個所見即所得的編輯器。而這次,這些煩惱徹底解決。XMLmind XML Editor!第一次發現它的時

    候有點相見恨晚的感覺,它讓我的文檔寫的如此輕松。
    不過有一點要注意,在官網下載的XMLmind XML Editor個人版是不支持直接將xml生成的html,pdf等格式

    的。還好,目前有xsltproc,fop,openjade這些工具支持,有了這些在windows下也可以轉換的工具,生

    成其他格式也不是什么難事。我目前就使用xsltproc來生成html。

    附上XMLmind XML Editor的下載地址http://www.xmlmind.com/xmleditor/persoedition.html
    附加上xsltproc的下載地址 http://www.zlatkovic.com/pub/libxml/
    再附上docbook的地址http://www.oasis-open.org/docbook/

    之前的麻煩統統消失,那么剩下的就是享受它的好處了。

    不用word,文檔也可以寫的這么漂亮。docbook,看第二眼發現你依然還是那么好。

    posted @ 2008-03-22 18:21 nighthawk 閱讀(373) | 評論 (0)編輯 收藏

    在目前使用的現有框架當中,利用springAOP機制來控制事務處理是目前最流行的一種控制事務的方式。

    但是我們在某種使用場合的過程中,為什么有時事務處理老是不起作用呢?這里,為您道出原因之一,

    首先請看一段話

    Spring的事務實現采用基于AOP的攔截器來實現,如果沒有在事務配置的時候注明回滾的checked exception,那么只有在發生了unchecked exception的時候,才會進行事務回滾。

    有必要先解釋一下checked exceptionunchecked exception

    先看看EXCEPTIONJDK文檔當中的結構

    java.lang.Object
      繼承者 java.lang.Throwable
          繼承者 java.lang.Exception
              繼承者 java.lang.RuntimeException
     
    Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException同樣也是Exception的子類,但是它們是特殊的。Exception是作為checked Exception 出現的。
    所以,除了ErrorRuntimeException,其他剩下的異常都是你需要關心的,而這些異常類統稱為Checked Exception
     

    有了以上的基礎,看看我們框架當中的事務屬性

    <property name="transactionAttributes">

                         <props>

                                <prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>

                                <prop key="save*">PROPAGATION_REQUIRED </prop>

                                <prop key="delete*">PROPAGATION_REQUIRED</prop>

                                <prop key="update*">PROPAGATION_REQUIRED </prop>

                         </props>

     

    </property>

     

    此處,我們沒有指定任何異常,那么它目前默認處理的就是unchecked exception了,再結合我們自身每個項目的模塊,在我們的每個項目當中幾乎都定義了自己的異常,這些異常都是繼承自Exception,很不幸的是,我們繼承的Exception包括自己定義的異常,都是checked exception。

     

    所以,在我們的事務處理機制當中,事務不管用了。

    解決辦法有2個:

    1,在事務屬性后面加上需要回滾的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那個"-",對應的是"+")

    2, 不改配置文件,將需要事務回滾的異常繼承自unchecked exception類,也就是RuntimeException。

    (nighthawk)

    posted @ 2007-07-09 09:32 nighthawk 閱讀(2084) | 評論 (3)編輯 收藏

    主站蜘蛛池模板: 亚洲国产精久久久久久久| 成人亚洲网站www在线观看| 亚洲大尺度无码无码专区| 日韩免费码中文在线观看| 成年女人毛片免费视频| 色婷五月综激情亚洲综合| 在线精品一卡乱码免费| 亚洲伊人精品综合在合线| 日本妇人成熟免费中文字幕| 亚洲乱码一区av春药高潮| 成年女人男人免费视频播放| 最新国产成人亚洲精品影院| 午夜电影免费观看| 特级av毛片免费观看| 亚洲精品国产V片在线观看| aa毛片免费全部播放完整| 亚洲av无码一区二区三区不卡| 成人片黄网站色大片免费观看APP| 久久亚洲成a人片| 久久成人国产精品免费软件| 国产精品亚洲片夜色在线| 美女被免费视频网站a国产| 一本久久A久久免费精品不卡| 国产亚洲精品久久久久秋霞| 一级毛片免费视频| 亚洲中文字幕乱码熟女在线| xvideos亚洲永久网址| 精品人妻系列无码人妻免费视频| 亚洲AV综合色区无码一区| 18国产精品白浆在线观看免费| 亚洲AV无码国产剧情| 不卡精品国产_亚洲人成在线| 99ee6热久久免费精品6| 亚洲中文字幕无码av| 亚洲中文字幕伊人久久无码| 99久久久国产精品免费蜜臀| 亚洲GV天堂无码男同在线观看| 国产成人麻豆亚洲综合无码精品| 黄在线观看www免费看| 黄色三级三级免费看| 亚洲综合久久1区2区3区|