fkjava

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

          #

           

           

           首次接觸到WebService,要調用一個發送短信的WebService里方法sendMQ,不廢話,自己留個備份,也給需要的朋友,代碼如下:

             

              Service service = new Service();

             

              String url = “http://xxxxx.xx.xx/yy.asmx”;

             

              //在瀏覽器中打開url,可以找到SOAPAction: http://www.chinsoft.com.cn/SendMQString namespace = http://www.chinsoft.com.cn/;String actionUri = SendMQ;

             

              //Action路徑String op = SendMQ;

             

              //要調用的方法名Call call = Call service.createCall();call.setTargetEndpointAddressnew java.net.URLurl));call.setUsername(“your username”);

             

              // 用戶名(如果需要驗證)call.setPassword(“your password”);

             

              // 密碼call.setUseSOAPActiontrue);call.setSOAPActionURInamespace + actionUri);

             

              // action uricall.setOperationNamenew QNamenamespace, op));

             

              // 設置要調用哪個方法

             

              // 設置參數名稱,具體參照從瀏覽器中看到的call.addParameternew QNameinstance.NAMESPACE, sender”),

             

              XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, phoneNumber”),

             

              XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, content”),

             

              XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, sendTime”),

             

              XMLType.XSD_STRING, ParameterMode.IN);call.setReturnTypeorg.apache.axis.encoding.XMLType.XSD_STRING);

             

              // 要返回的數據類型String sendTime = 2011-07-14 13:05:32;Object[] params = new Object[] {xxx, 13223333333, “測試短信”, sendTime };String result = String call.invokeparams);

             

              //方法執行后的返回值

             

              以上代碼用到的包:apache axis

             

              import javax.xml.namespace.QName;

             

              import javax.xml.rpc.ParameterMode;

             

              import javax.xml.rpc.encoding.XMLType;

             

              import org.apache.axis.client.Call;

             

              import org.apache.axis.client.Service;

             

          希望幫助需要的朋友。

           

               您正在看的文章來自瘋狂軟件教育中心 www.fkjava.org

               信息咨詢:Q564205990         星老師

           

          posted @ 2012-08-14 15:48 瘋狂軟件 閱讀(531) | 評論 (0)編輯 收藏

           

          在一個jsp文件中,有三處地方定義了字符集,哪位兄弟,請幫忙解答一下如下問題!先謝了!

           

          第一個問題:這三處定義字符集的作用分別是什么?

          第二個問題:這三處定義字符集的異同點是什么?

          第三個問題:這三個定義字符集的地方?在jsp文件都是必須要的嗎?]

           

          <!-- 1 -->

          <%@ page language="java" contentType="text/html;charset=UTF-8" errorPage="error.jsp" %>

          <!-- 2 -->

          <%@ page pageEncoding="UTF-8"%>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

          <head>

          <!-- 3 -->

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

          <title>DispathTruck</title>

           

           

          關于JSP頁面中的pageEncodingcontentType兩種屬性的區別:

           

          pageEncodingjsp文件本身的編碼

           

          contentTypecharset是指服務器發送給客戶端時的內容編碼

           

          JSP要經過兩次的“編碼”,第一階段會用pageEncoding,第二階段會用utf-8utf-8,第三階段就是由Tomcat出來的網頁, 用的是contentType

           

          第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。

           

          第二階段是由JAVACJAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什么編碼方案,經過這個階段的結果全部是UTF-8encodingjava源碼。

           

          JAVACUTF-8encoding讀取java源碼,編譯成UTF-8 encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)內表達的規范。

           

          第三階段是Tomcat(或其的application container)載入和執行階段二的來的JAVA二進制碼,輸出的結果,也就是在客戶端見到的,這時隱藏在階段一和階段二的參數contentType就發揮了功效

           

          contentType的設定.

           

          pageEncoding contentType的預設都是 ISO8859-1. 而隨便設定了其中一個, 另一個就跟著一樣了(TOMCAT4.1.27是如此). 但這不是絕對的, 這要看各自JSPC的處理方式. pageEncoding不等于contentType, 更有利亞洲區的文字 CJKVJSP網頁的開發和展示, (pageEncoding=GB2312 不等于 contentType=utf-8)

           

          jsp文件不像.java.java在被編譯器讀入的時候默認采用的是操作系統所設定的locale所對應的編碼,比如中國大陸就是GBK,臺灣就是BIG5或者MS950。而一般我們不管是在記事本還是在ue中寫代碼,如果沒有經過特別轉碼的話,寫出來的都是本地編碼格式的內容。所以編譯器采用的方法剛好可以讓虛擬機得到正確的資料。

           

          但是jsp文件不是這樣,它沒有這個默認轉碼過程,但是指定了pageEncoding就可以實現正確轉碼了。

           

          舉個例子:

           

          <%@ page contentType="text/html;charset=utf-8" %>

           

          大都會打印出亂碼,因為輸入的“你好”是gbk的,但是服務器是否正確抓到“你好”不得而知。

           

          但是如果更改為

           

          <%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>

           

          這樣就服務器一定會是正確抓到“你好”了'

          您正在看的文章來自瘋狂軟件教育中心 www.fkjava.org

          信息咨詢:Q564205990           星老師

          posted @ 2012-08-12 17:30 瘋狂軟件 閱讀(708) | 評論 (0)編輯 收藏

           

           1.oracle冷備份腳本:

              -- script:coldbak.sql

              -- creater:yangkai

              -- date:9.8.2012

              -- desc:offline full backup database

              --connect database

              connect system/zhangle;

              --shutdown database

              shutdown immediate;

              --Copy Data file

              $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.DBF c: ebei;

              --Copy Control file

              $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.CTL c: ebei;

              --Copy Log file

              $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.LOG c: ebei;

              --startup database

              startup;

              2.sqlplus之后,start coldbak.sql即可。

              其中需要注意的是:

              !xcopy命令怎么用?加個“!”是不是指“!”符號后面的命令執行操作系統的命令。我一執行!xcopy命令splplus就報錯說"sp2-0734未知命令開頭“!xcopy c:--忽略剩于的行。"

              是因為:

              Windows下,不是!xcopy 而應該是 $xcopy,在SQL*Plus $表示執行操作系統命令。

              Linuxspl*plussvrmgrl下,是用!xcopy

              cms下是copy

              Linux下是cp

              host是通用的,如:

              SQL> host copy G:ORACLEPRODUCT10.2.0ORADATAYANGKAICONTROL02.CTL c: ebei;

              已復制 1 個文件。

          SQL>'

           

               您正在看的文章來自瘋狂軟件教育中心 www.fkjava.org

               信息咨詢:Q564205990           星老師

           

          posted @ 2012-08-11 17:15 瘋狂軟件 閱讀(661) | 評論 (0)編輯 收藏

          多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程,這就要牽涉到多進程?當然,要了解到多進程,就要涉及到操作系統。不過大家也不要緊張,聽我慢慢道來。這其中的環節其實并不復雜。

          (1)單CPU下的多線程

          在沒有出現多核CPU之前,我們的計算資源是唯一的。那么如果系統中有多個任務要處理的話,那么就需要按照某種規則依次調度這些任務進行處理。什么規則呢?可以是一些簡單的調度方法,比如說

          1)按照優先級調度

          2)按照FIFO調度

          3)按照時間片調度等等

          當然,除了CPU資源之外,系統中還有一些其他的資源需要共享,比如說內存、文件、端口、socket等。既然前面說到系統中的資源是有限的,那么獲取這些資源的最小單元體是什么呢,其實就是進程。

          (2)多核CPU下的多線程

          沒有出現多核之前,我們的CPU實際上是按照某種規則對線程依次進行調度的。在某一個特定的時刻,CPU執行的還是某一個特定的線程。然而,現在有了多核CPU,一切變得不一樣了,因為在某一時刻很有可能確實是n個任務在n個核上運行。我們可以編寫一個簡單的open mp測試一下,如果還是一個核,運行的時間就應該是一樣的。

          (3)多線程編程

          為什么要多線程編程呢?這其中的原因很多,我們可以舉例解決

          1)有的是為了提高運行的速度,比如多核cpu下的多線程

          2)有的是為了提高資源的利用率,比如在網絡環境下下載資源時,時延常常很高,我們可以通過不同的thread從不同的地方獲取資源,這樣可以提高效率

          3)有的為了提供更好的服務,比如說是服務器

          4)其他需要多線程編程的地方等等

          轉自:瘋狂軟件

          posted @ 2012-05-12 16:44 瘋狂軟件 閱讀(136) | 評論 (0)編輯 收藏

          軟件架構是在軟件需求出來之后,軟件構建開始之前的工作,架構師應該確定的事情有:

          1、程序組織

          架構應該定義程序中的主要構造塊。根據程序規模不同,各個構造塊可能是單個類,也可能是由多個類組成的系統。每個構造塊實現一個高層功能。并且每個需求都至少有一個構造塊覆蓋它。

          定義各個構造塊之間的通信規則和依賴規則

          2、主要的類

          架構應該詳細定義或寫出所用的主要的類。并指出該類如何與其他類交互。

          架構不需要對所有類進行說明,使用82法則:對構成系統80%功能的20%類進行說明

          3、數據設計

          架構應該說明清楚用到的數據表的設計,并且描述為何做出這樣的選擇

          4、業務規則

          對特定的業務規則(比如:客戶信息的更新時間不能超過30秒)要有架構方面的描述(比如30秒內對客戶端進行信息同步)

          5、用戶界面設計

          架構應該有詳細的用戶界面,好的用戶界面直接關系到功能的實現和軟件的最終效果

          6、資源管理

          架構應該對稀缺資源有管理計劃。比如數據庫連接,線程,句柄等的使用。有可能需要設計一個“資源管理器”的模塊

          7、安全性

          架構應該描述用戶據輸入數據,cookie,配置文件等的安全性說明

          8性能

          應該根據需求文檔中對性能的描述來提供估計的性能數據,并且說明為什么架構師相信能達到性能目的。或者為什么有的性能指標無法達到

          9、可伸縮性

          架構應該說明系統如何應對以后用戶數量,服務器數量,網絡節點數量,數據庫記錄數,數據庫記錄長度,交易量等增長的需求。

          10、互用性

          如果系統與其他軟件或硬件有共享資源,架構應該說明如何完成這項功能

          11、國際化/本地化

          系統式是否支持國際化,如何在與用戶交互的模塊中實現國際化

          12、輸入輸出

          架構應該詳細定義讀取策略

          13、錯誤處理

          有人估計程序中高達90%的代碼是用來處理異常和錯誤的,意味只有10%的代碼是用來處理常規情況的。

          14、容錯性

          容錯是增強系統可靠性的技術,如果出現了錯誤是轉入“部分運轉”還是“功能退化”?

          15、架構的可行性

          架構師應該論證自己這個系統設計的可行性

          16過度工程

          即健壯性。架構應該指出哪些類哪些模塊需要進行過度工程(健壯性測試),哪些類或模塊只需要做出最簡單的工作性能

          17、關于買還是造

          一些軟件,開源代碼,處理程序,是使用現貨采購還是自己定制開發

          18、關于復用

          如果使用業界已經存在的軟件,開源代碼等資源,應該說明清楚如何對這些東西進行加工。

          19、變更策略

          架構應該清楚描述處理變更的策略。架構應該列出已經考慮過的可能會有變更的需求或者可能增強的功能。并提供處理情況,比如使用版本號進行控制,或者將代碼設計成可動態添加新數據

          20、架構的總體質量

          架構應該清楚描述其做的所有主要決策的動機明確指出有風險的地方

          轉自:瘋狂軟件

          posted @ 2012-05-12 16:43 瘋狂軟件 閱讀(272) | 評論 (0)編輯 收藏

          偶然在網上看到了這個有趣的問題,有人問:既然普遍認為編程是比較難的工作,為什么業務分析人員和項目經理們會拿比程序員更多的薪水?雖然大多數的時候程序員都被發現是最晚離開公司的人,可那些家伙的工作卻能拿更多的報酬,為什么會這樣?

          回答的人很多,但似乎只有一個是比較合情合理的,它是從經濟學原理的角度分析的這個問題。

          人們所能獲得的報酬往往會低于老板們的“最高標準”,而高于人們自己的“最低要求”。在這個范圍內,你的實際收入依賴于你相對于你的老板的討價還價的能力。

          假設你給公司提供的服務價值每天1000美元。如果你用槍指著他,他會給你這個價格,因為他別無選擇。如果你別無選擇,你只能接受每天100美元水平。這是你的浮動范圍。

          假設你是一個新手,沒有背景關系,不出名,你的老板是谷歌。谷歌有很強的討價資本,它可以等待,去雇用其他人,很多人都想為它工作。你的資本很少,你需要付房租,所以你只能接受每天100多美元,而不是1000美元。

          假設你是地球上最后一個會COBOL語言的程序員,而你的老板的主機上正跑著COBOL程序。那么,你擁有很強的討價還價的資本,你將能得到接近每天1000美元的報酬。

          所以,要么是你的項目經理或業務分析員對公司更有價值,要么就是他們有更多的討價還價的資本。我并不認為是前一種情況,也就是說,應該是后一種情況。善于人際交往的人很少。這種事情也不能外包——因為他們需要接觸客戶。他們的相對稀缺給了他們更多討價的資本,所以他們有了更高的報酬。

          這個巧妙的回答來自NRM,盡管跟其它的各種和政治相關的解答比起來有點乏味,但它確實反映了實際情況。就像他提到的,善于交際的人稀少,這種人在任何公司都能來到巨大的好處,尤其是在軟件開發領域。

          轉自瘋狂軟

          posted @ 2012-05-11 16:59 瘋狂軟件 閱讀(135) | 評論 (0)編輯 收藏

          每次去IT社區,都在吐槽:說技術人員是多么的苦逼;每次和一些搞技術的朋友聚會,聊的也是大家的生活是多么的苦逼;每次上網看微博,也是充斥著“技術人員苦逼論”

          今天談到這個話題,固然會有很多的不同的意見和想法,我這里這是就從我看到的一些現象和自己的一些思考說說技術人員到底為什么“苦逼”。

          為什么苦逼?

          原因一大堆,對于外部的因數,我們很難控制,例如中國的IT國情和對技術人員的觀念。但是,在商業中有這樣一句話可以借鑒一下:經濟再蕭條,也有人在賺錢;形式再好,也有很多人在虧本,很多的公司在倒閉。

          很多的時候,我們倒苦水,但是心里要知道:是大的環境讓我們苦逼,還是我們本身就得苦逼,換句話說,苦逼是我們自己應得的。這話很多人不愛聽,但是很多時候確是事實。

          這半年多以來,去了不少大大小小的公司,為他們的項目進行救火,解決他們現有的性能等問題。很多的項目在做的時候,很少考慮什么性能,安全等因素,都是上面的人在不斷的催,下面的人在火急火燎的加班加點趕進度—今天完成了什么功能點,明天要完成什么功能點。于是很多的技術人員顧不上什么,一心思的把功能堆了起來。苦逼的第一個原因出來了。

          終于,項目搞定了,上線跑了沒有多久,問題就出來了:項目功能是齊全,但是就是無法使用,有的功能慢的像拖牛。于是,有人建議開始買好的設備,加大帶寬,以為錢砸下去了,情況會好點。但是好景不長,甚至事與愿違。于是一堆人就開始焦慮,束手無策,技術人員又開始加班加點的解決明明知道自己無法解決的問題,于是苦逼的第二個原因出來了。

          在無法搞定的情況下,技術人員開始郁悶了,接著瘋狂的上網開始收集可能的偏方,然后一股腦的用在項目中,求神拜佛的希望偏方有效果,運氣好,暫時搞定了,那就皆大歡喜,搞不定,把之前的步驟再次重復一次吧。基本可以用下面的一個幽默來總結這個過程

          從接觸到的一些技術朋友來看,有些朋友的技術能力不錯,有的卻讓我想抽自己,沒有聽錯,是抽我自己。抽我自己為什么要給他們講這么多的東西,而這些東西他們又不懂,然后又非得把懂這些知識的鋪墊知識給他們講。例如,項目出現了內存泄露的問題,公司的技術人員問題我這么回事,于是我告訴他們是VAS的碎片,他們又問我們為什么VAS碎片了,于是我們給他們講述,但是他們聽不懂,于是讓我們給他們講解一些鋪墊知識:Window內存機制,.NET內存機制等。本來以為大家都是同行,交流交流,沒想到,使得我們自己陷入了苦逼

          同時也深深的感受的一點:很多的技術朋友在走出了校門或者培訓學校之后,技術能力就沒有在進步了,一是處于打混的階段,有的運氣好,很多年之后,混到了不錯的職位,但是很多的人卻混的非常不幸,于是他們就成為“技術人員苦逼論”的忠實粉絲。其中有一點就是很多的朋友不喜歡自學,總是希望有人手把手的教。我們遇到的一個最搞人的情況就是,我們已經把功能全部調完了,代碼完全實現了,服務器也是全部配置好了,就差調試了,很多的人依然不動。

          也使得我想起另外一個情況:每次有很多的朋友都說要學習技術內幕,要學深一點,喊著叫著要看深一點的文章,但是寫出來之后,沒有幾個人真正的看完,前幾篇簡單的介紹看的人很多,稍微深一點,就沒有人看了。也有很多的朋友想到處找大牛拜師,都希望沾點牛氣,成為牛中的一員。但是技術,能力,這個東西終究靠自己。用心與不用心,差別就是天壤之別。

          我常常說這樣的話:社會不是初中,高中,沒有人會像老師那樣手把手的教你,盯著你,一切靠自己。沒有誰就非得要叫你,沒有人欠你的,如果自己都不上進,想做阿斗,諸葛亮來了也沒用辦法。物競天擇,適者生存!

          我非常敬佩那些出身不好但是一直堅持奮斗的人,也非常敬仰那么環境舒適還依然努力的人。你遇到過很多聰明人,你的大學同學,你的同事,你的朋友,有幾個比你傻?很多年以后,你會看到成功的并不是最聰明的人。因為決定成功的更多是非智力因素:明確的目標,積極的心態,努力和堅持,承受挫折和壓力的能力,成熟的接人待物等等。有一種人注定沒戲:不努力和怨天尤人。看到這里,技術人員為什么苦逼,可能各人心中有了答案。

          轉自瘋狂軟

          posted @ 2012-05-11 16:58 瘋狂軟件 閱讀(163) | 評論 (0)編輯 收藏

          Java運行環境交互

          SunJava提供了豐富的基礎類庫,Java SE提供了三千多個基礎類(包括第7章介紹的集合框架),通過這些基礎類庫可以提高開發效率,降低開發難度。對于合格的Java程序員而言,至少要熟悉Java SE70%以上的類(當然,筆者并不是讓讀者去背誦Java API文檔),但在反復查閱API文檔的過程中,大腦會自動記住大部分類的功能、方法,因此程序員一定要多練,多敲代碼。

              Java提供了StringStringBufferStringBuilder來處理字符串,它們之間存在少許差別,本章會詳細介紹它們之間的差別,以及如何選擇合適的字符串類。Java還提供了DateCalendar來處理日期、時間,其中Date是一個已經過時的API,通常推薦使用Calendar來處理日期、時間。

              正則表達式是一個強大的文本處理工具,通過正則表達式可以對文本內容查找、替換、分割等操作。從JDK1.4以后,Java也增加了對正則表達式的支持,包括新增的PatternMatcher兩個類,并改寫了String類,讓String類增加了正則表達式支持,增加了正則表達式功能后的String類更加強大。

              Java還提供了非常簡單的國際化支持,Java使用Locale對象封裝一個國家、語言環境,再使用ResourceBundle根據Locale加載語言資源包,當ResourceBundle加載了指定Locale對應的語言資源文件后,ResourceBundle對象就可調用getString方法來取出指定key所對應的消息字符串。

          與用戶互動

              如果一個程序總是按既定的流程運行,無須處理用戶動作,這個程序總是比較簡單的。實際上,絕大部分程序都需要處理用戶動作,包括接受用戶的鍵盤輸入、鼠標動作等。因為現在還未涉及圖形用戶接口(GUI)編程,故本節主要介紹程序如何獲得用戶的鍵盤輸入。

          運行Java程序的參數

          回憶Java程序的入口:main方法的方法簽名:

          //Java程序入口:main方法

          public static void main(String[] args){….}

              現在可以詳細講解main方法為什么采用這個方法簽名:

              1public修飾符:Java類由JVM調用,為了讓JVM可以自由調用這個main方法,所以使用public修飾符把這個方法暴露出來。

              2static修飾符:JVM調用這個主方法時,不可能先創建該主類的對象,然后通過對象來調用該主方法。JVM直接通過主類來調用主方法,因此使用static修飾該主方法。

              3void返回值:因為主方法被JVM調用,該方法的返回值將返回給 JVM,這沒有任何意義,因此main方法沒有返回值。

              上面方法中還包括一個字符串數組形參,根據前面介紹方法調用的規則:誰調用方法,誰負責為形參賦值。也就是說,main方法由JVM調用,即args形參應該由JVM負責賦值。但JVM怎么知道如何為args數組賦值呢?我們先看下面程序:

          程序清單:codes/09/9- 1/TestArgs.java

          public class TestArgs

          {

          public static void main(String[] args)

          {

          //輸出args數組的長度

          System.out.println(args.length);

          //遍歷args數組的每個元素

          for(String arg:args)

          {

          System.out.pringln(arg);

          }}}   

          上面程序幾乎是最簡單的“HelloWorld”程序,只是這個程序增加了輸出args數組的長度,遍歷args數組元素的代碼。使用java TestArgs命令運行上面程序,看到程序僅僅輸出一個0,這表明args數組是一個長度為0的空數組—這是合理的:因為計算機是沒有思考能力的,它只能忠實地執行用戶交給它的任務,既然我們沒有給args數組設定參數值,那么JVM就不知道args數組的元素,所以JVM以將args數組設置成一個長度為。的數組。

          改為如下命令來運行上面程序:

          java TestArgs Java Spring

          看到如圖9.1所示的運行結果:


          9.1main方法的形參數組賦值

          從圖9.1中可以看出,如果運行Java程序時在類名后緊跟一個或多個字符串(多個字符串之間以空格隔開)JVM就會把這些字符串依次賦給args數組元素。運行Java程序時的參數與args數組之間的對應關系如圖9.2所示:


          9.2運行Java程序時參數和args數組的關系

          如果某參數本身包含了空格,則應該將該參數用雙引號(“)括起來,否則JVM會把這個空格當成參數分隔符,而不是當成參數本身。例如采用如下命令來運行上面程序:

           java TestArgs “Java Spring”

          運行上面命令,看到args數組的長度是1,只有一個數組元素,其值是Java Spring

          摘自《瘋狂java講義》

          posted @ 2012-05-08 15:55 瘋狂軟件 閱讀(235) | 評論 (0)編輯 收藏

           

          EJB調用是耗時、費力的。怎么提高EJB的性能?我們為解決這一問題,開始邊寫邊討論。等到完成了,我才發現,我們所應用的技巧總結一下,竟有十條。把提高EJB性能的這些技巧總結一下,為以后的項目做參考。

          1.用一個Session Bean封裝多個Entity Bean,將原來的多個Entity BeanRemote調用和Local調用封裝在一個Session Bean中。所以建立一個ServerFacade,它為多個對象提供統一獲取EJB Home和獲取對象的接口。ServerFacade為程序要用到的所有EJBhome handle提供緩存,提高訪問JNDI Name的時間,達到提高訪問效率的目的。以后查找JNDI Name的方法都應寫在接口里,調用時直接從接口調用。

          2.EJBRemote接口中使用粗粒度的方法,不推薦使用細粒度方法。

          3.如果EJBRemote接口獲取成功,應不再使用Remote接口,而是將Remote接口構造成一個一般的Java對象,通過調用一般的JAVA對象的方法來達到減少對網絡的訪問。

          4.如果你部署EJB客戶端和EJB在相同的JVM上,建設使用EJB2.0規范的Local接口代替Remote接口。

          5."transient"關鍵字聲明不必要的數據變量,替代以前的"public""private"等,避免不必要的數據變量占用網絡資源。

          6.ejb-jar.XML部署文件中,對Session Bean中非事務的方法,將trans-attribute屬性賦為"NotSupported""Never"

          7.設置事務的超時時間,在JBoss中,要修改${jboss.home}/server/${jboss.configuration}/conf/jboss-service.xml

          8.當事務鎖定數據庫的行記錄時,事務應跨越可能的最小的時間。

          9.調整EJB 服務器的各種參數,如線程數、EJB池大小、連接池參數等。以在JBoss修改連接池參數為示例,進行說明。如果JBossMySQL相連,配置${jboss.home}/server/${jboss.configuration}/deploy/mysql-service.xml,來修改連接池參數,包括MinSizeMaxSizeBlockingTimeoutMillisIdleTimeoutMinutesCriteria等,各參數的含義如下所示:

          1)MinSize :連接池保持的最小連接數。

          2)MaxSize :連接池保持的最大連接數。

          3)BlockingTimeoutMillis :拋出異常前最大的等待連接時間。

          4)IdleTimeoutMinutes :關閉連接前連接空閑的最大時間。

          5)Criteria :有ByContainerAndApplicationByContainerByApplicationByNothing等值。

          10.對于數據庫事務,應選擇較低成本的事務等級,避免造成壞數據。遞增成本的事務等級包括:

          TRANSACTION_READ_UNCOMMITED,

          TRANSACTION_READ_COMMITED,

          TRANSACTION_REPEATABLE_READ,

          TRANSACTION_SERIALIZABLE

          轉自瘋狂軟件

          posted @ 2012-05-08 15:52 瘋狂軟件 閱讀(118) | 評論 (0)編輯 收藏

          Java內存管理的9個小技巧

          以前很多人都說“Java完了,只等著衰亡吧!”,為什么呢?最簡單的的例子就是Java做的系統時非常占內存!一聽到這樣的話,一定會有不少人站出來為Java辯護,并舉出一堆的性能測試報告來證明這一點。其實從理論上來講Java做的系統并不比其他語言開發出來的系統更占用內存,那么為什么卻有這么多理由來證明它確實占內存呢?兩個字,陋習。

          1、別用new Boolean()。

          在很多場景中Boolean類型是必須的,比如JDBCboolean類型的setget都是通過Boolean封裝傳遞的,大部分ORM也是用Boolean來封裝boolean類型的,比如

          ps.setBoolean(“isClosed”,new Booleantrue));

          ps.setBoolean(“isClosed”,new BooleanisClosed));

          ps.setBoolean(“isClosed”,new Booleani==3));

          通常這些系統中構造的Boolean實例的個數是相當多的,所以系統中充滿了大量Boolean實例小對象,這是相當消耗內存的。Boolean類實際上只要兩個實例就夠了,一個true的實例,一個false的實例。Boolean類提供兩了個靜態變量:

          public static final Boolean TRUE = new Booleantrue;

          public static final Boolean FALSE = new Booleanfalse;

          因為valueOf的內部實現是:return b TRUE FALSE;所以可以節省大量內存。相信如果Java規范直接把Boolean的構造函數規定成private,就再也不會出現這種情況了。

          2、別用new Integer

          Boolean類似,java開發中使用Integer封裝int的場合也非常 多,并且通常用int表示的數值通常都非常小。SUN SDK中對Integer的實例化進行了優化,Integer類緩存了-128127256個狀態的Integer,如果使用 Integer.valueOfint i),傳入的int范圍正好在此內,就返回靜態實例。這樣如果我們使用Integer.valueOf代替new Integer的話也將大大降低內存的占用。如果您的系統要在不同的SDK(比如IBM SDK)中使用的話,那么可以自己做了工具類封裝一下,比如IntegerUtils.valueOf(),這樣就可以在任何SDK中都可以使用這種特性。

          3、用StringBuffer代替字符串相加。

          這個我就不多講了,因為已經被 人講過N次了。我只想將一個不是笑話的笑話,我在看國內某“著名”java開發的WEB系統的源碼中,竟然發現其中大量的使用字符串相加,一個拼裝SQL 語句的方法中竟然最多構造了將近100string實例。無語中!

          4、過濫使用哈希表

          有一定開發經驗的開發人員經常會使用hash表(hash 表在JDK中的一個實現就是HashMap)來緩存一些數據,從而提高系統的運行速度。比如使用HashMap緩存一些物料信息、人員信息等基礎資料,這 在提高系統速度的同時也加大了系統的內存占用,特別是當緩存的資料比較多的時候。其實我們可以使用操作系統中的緩存的概念來解決這個問題,也就是給被緩存的分配一個一定大小的緩存容器,按照一定的算法淘汰不需要繼續緩存的對象,這樣一方面會因為進行了對象緩存而提高了系統的運行效率,同時由于緩存容器不是無限制擴大,從而也減少了系統的內存占用。現在有很多開源的緩存實現項目,比如ehcacheoscache等,這些項目都實現了FIFOMRU等常見的緩存算法。

          5、避免過深的類層次結構和過深的方法調用。因為這兩者都是非常占用內存的(特別是方法調用更是堆棧空間的消耗大戶)。

          6、變量只有在用到它的時候才定義和實例化。

          7、盡量避免使用static變量,類內私有常量可以用final來代替。

          8、對頻繁使用的對象采用對象池技術

          9、保證每個IO操作,connection及時關閉
          轉自:瘋狂軟件

          posted @ 2012-05-04 11:58 瘋狂軟件 閱讀(117) | 評論 (0)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 名山县| 门源| 小金县| 当雄县| 南陵县| 青铜峡市| 阿拉善右旗| 榆树市| 合川市| 巴塘县| 名山县| 延津县| 长丰县| 景宁| 平乐县| 平阳县| 河间市| 大埔县| 含山县| 高陵县| 平乐县| 拜城县| 商河县| 西和县| 新沂市| 莱西市| 渭南市| 巩留县| 南安市| 皋兰县| 望都县| 上杭县| 博爱县| 潮安县| 万全县| 壶关县| 巴青县| 娄底市| 舞钢市| 潍坊市| 旅游|