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

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

          #

          問題現(xiàn)象:在做web應(yīng)用時(shí)會(huì)碰到這種情況,某些地方無法通過web當(dāng)中的ApplicationContext來獲得springIOC容器提供的bean,比如提供給外界的webservice接口,這個(gè)時(shí)候就需要手工通過ClassPathXmlApplicationContext等方式來獲取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,這里沒有指定,默認(rèn)的是單例。
          一切都是那么順利,像這樣的service代碼寫的應(yīng)該不下幾百個(gè),可能諸位寫的更多,過程依然很陶醉,修改完畢。測(cè)試,再測(cè)試。什么?ORA-12519錯(cuò)誤!見鬼,我打造的這套號(hào)稱簡(jiǎn)易快速的SSH2框架已經(jīng)在多個(gè)項(xiàng)目好評(píng)無數(shù)久經(jīng)考驗(yàn)了,寫了不下幾百次的service居然報(bào)ORA-12519錯(cuò)誤。
          迅速打開PLSQL,檢查數(shù)據(jù)庫session,Select Count(1) From v$session t Where t.SCHEMANAME='XXX';
          隨著service的執(zhí)行,session數(shù)在增加,沒有減少的意思。是的,當(dāng)時(shí)就是這樣。

          解決思路:這種錯(cuò)誤出現(xiàn)在久經(jīng)考驗(yàn)的框架當(dāng)中,我心里是相當(dāng)不安的,居然會(huì)有這種低級(jí)趣味的錯(cuò)誤。整理思路開始分析:這段代碼唯一與以前不同的地方就是,我們?cè)趙eb應(yīng)用中,是通過容器加載提供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é)果出來了,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ì)生命周期也描述的很清楚。通過DisposableBean或者指定destroy-method都能很好的釋放單例對(duì)象。而prototype類型的對(duì)象需要客戶端顯式的指定釋放,釋放對(duì)象完全是客戶端控制,spring不負(fù)責(zé)釋放。
          所以,要改善context的加載方式,盡量的少多次去加載,實(shí)在沒辦法的情況下,一定要記得關(guān)閉。
          最后,寫代碼的隨意性,圖省事,不經(jīng)思考,是造成這種BUG的罪惡根源。

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

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

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

          是缺乏一個(gè)所見即所得的編輯器。而這次,這些煩惱徹底解決。XMLmind XML Editor!第一次發(fā)現(xiàn)它的時(shí)

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

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

          成其他格式也不是什么難事。我目前就使用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/

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

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

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

          在目前使用的現(xiàn)有框架當(dāng)中,利用springAOP機(jī)制來控制事務(wù)處理是目前最流行的一種控制事務(wù)的方式。

          但是我們?cè)谀撤N使用場(chǎng)合的過程中,為什么有時(shí)事務(wù)處理老是不起作用呢?這里,為您道出原因之一,

          首先請(qǐng)看一段話

          Spring的事務(wù)實(shí)現(xiàn)采用基于AOP的攔截器來實(shí)現(xiàn),如果沒有在事務(wù)配置的時(shí)候注明回滾的checked exception,那么只有在發(fā)生了unchecked exception的時(shí)候,才會(huì)進(jìn)行事務(wù)回滾。

          有必要先解釋一下checked exceptionunchecked exception

          先看看EXCEPTIONJDK文檔當(dāng)中的結(jié)構(gòu)

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

          有了以上的基礎(chǔ),看看我們框架當(dāng)中的事務(wù)屬性

          <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>

           

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

           

          所以,在我們的事務(wù)處理機(jī)制當(dāng)中,事務(wù)不管用了。

          解決辦法有2個(gè):

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

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

          (nighthawk)

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

          現(xiàn)在再做2006年的總結(jié),似乎有點(diǎn)晚了,畢竟現(xiàn)在陽歷已經(jīng)是2007年2月份了,不過按照老家的傳統(tǒng),沒過春節(jié),那還算2006年。按照總結(jié)的慣例,應(yīng)該是先回顧后展望,所以我也先回顧。這個(gè)總結(jié),只談感受。
          06年3月份,開始維護(hù)部門的一個(gè)新的項(xiàng)目,換了個(gè)新的環(huán)境,不過對(duì)我而言,接觸的卻不是新的技術(shù)。也許現(xiàn)在已經(jīng)不是追新的階段了。
          做軟件的都有個(gè)習(xí)慣,愛接觸新的技術(shù),這幾年JAVA層出不窮的框架,技術(shù)太多了,讓人有點(diǎn)應(yīng)接不瑕。這些東西要是不接觸,有時(shí)候還真會(huì)被人笑話,毫不例外,我也不落俗套,其實(shí)我并不是一個(gè)對(duì)新鮮事物非常敏感的人,不過有些技術(shù),還是需要了解為好。
          06年,接觸的依然是struts,依然是hibernate,依然是spring。抽空看了看JSF,EJB3.0。spring和hibernate依然是那么輝煌,而struts,已經(jīng)開始沒落了。webwork2開始搶風(fēng)頭,包括現(xiàn)在的struts2,轉(zhuǎn)眼間,已經(jīng)不是我們熟悉的struts了,無非是包裝過后的webwork2,轉(zhuǎn)眼間,也感覺到了時(shí)間的流逝。通宵達(dá)旦培訓(xùn)學(xué)習(xí)struts的時(shí)候,已經(jīng)是3年前了。
          06年,接觸了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),讓我明白除了larman的領(lǐng)域模型,原來還有eric的領(lǐng)域模型,可惜目前,我依然是個(gè)學(xué)習(xí)者,而不是一個(gè)實(shí)踐者。
          06年上半年,我虔誠的捧來了martin的重構(gòu),可惜到目前為止,那本書還是新的。
          06年,也接觸了天書般的分析模式。它當(dāng)之無愧的當(dāng)選為我的最佳催眠書,以至于我現(xiàn)在不拿著它睡不著,因?yàn)樗拇_讓我沒看懂。
          06年,我依然在看2年前買的UML和模式應(yīng)用,依然偶爾翻翻1年前買的J2EE核心模式。不過這一年,J2EE核心模式似乎有點(diǎn)輝煌不在了。
          頭幾年,感覺一切都是新的,一切都要學(xué)。而這一年,感覺進(jìn)步遠(yuǎn)不如前2年了,也許進(jìn)步更快,我沒有發(fā)現(xiàn)而已。我一直在告戒自己,學(xué)習(xí)分析與設(shè)計(jì)不會(huì)有學(xué)習(xí)語言或者框架那種立竿見影的效果,它是一個(gè)積累,一個(gè)持續(xù)性的過程,我還在等著頓悟分析模式的那一天。
          07年,我依然會(huì)追隨大師們的腳步。
          07年,還要繼續(xù)做點(diǎn)什么。

          posted @ 2007-02-13 09:55 nighthawk 閱讀(265) | 評(píng)論 (2)編輯 收藏

          僅列出標(biāo)題
          共5頁: 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 曲沃县| 托克托县| 鄯善县| 福清市| 高雄市| 襄垣县| 玉山县| 宿迁市| 任丘市| 新余市| 青浦区| 疏附县| 孟州市| 通化市| 文山县| 深州市| 石城县| 茂名市| 新营市| 日照市| 柘城县| 洛川县| 论坛| 旅游| 吴堡县| 体育| 宜兰市| 白沙| 西畴县| 屏山县| 龙川县| 乐安县| 锡林郭勒盟| 确山县| 额尔古纳市| 青河县| 南漳县| 容城县| 台山市| 偏关县| 东方市|