技術門診是51CTO社區(qū)品牌欄目,每周邀請一位客座專家,為廣大技術網(wǎng)友解答疑問。從熱門技術到前沿知識,從技術答疑到職業(yè)規(guī)劃。每期一個主題,站在最新最熱的技術前沿為你引航!
技術門診是51CTO社區(qū)品牌欄目,每周邀請一位客座專家,為廣大技術網(wǎng)友解答疑問。從熱門技術到前沿知識,從技術答疑到職業(yè)規(guī)劃。每期一個主題,站在最新最熱的技術前沿為你引航!
本期特邀《輕量級Java EE企業(yè)應用實戰(zhàn)(第3版)》一書作者李剛老師,針對Java EE企業(yè)應用開發(fā)中遇到的典型問題給予解答,歡迎網(wǎng)友積極提問,與專家一起討論!
查看本期門診精彩實錄:http://doctor.51cto.com/develop-261.html
參與最新技術門診:運維工程師的生存法則
精選本期網(wǎng)友提問與專家解答,以供網(wǎng)友學習參考。
Q:學了兩年的Java,從事J2EE企業(yè)級網(wǎng)站開發(fā)工作也近一年的時間了,自己想去學習Android,但是有人說,如果去學Android,那么你將會與J2EE方面的知識絕緣,而自己對這方面又不想丟下,不想與它絕緣,一種矛盾油然而生,請李老師您給點建議,謝謝!
A :如果有扎實的Java基本功,Java開發(fā)者是可以非常快速都過度到Android開發(fā)的。關于如何從Java開發(fā)者快速過度到Android開發(fā),可以先了解一下《瘋狂Android講義》,應該對你有幫助。
整個Java、Java EE、Android的學習路線,可以參考http://www.crazyit.org/thread-5953-1-1.html的學習路線圖。
Android完全可以和已有的JavaEE技術融合:因為Android只是一個移動客戶端,而企業(yè)級應用的數(shù)據(jù)存儲、數(shù)據(jù)計算都放在服務器端完成。Android客戶端可以充分發(fā)揮“攜帶方便、上網(wǎng)方便”的優(yōu)勢,作為企業(yè)級應用的客戶端使用。
Q:李老師您好。我想補充一我的問題,我想問一下關于:
1.關于我們使用這些框架,性能優(yōu)化方面的建議。
2.關于代碼優(yōu)化方面,架構優(yōu)化方面了希望能給指點個方面。
十分感謝,期待您的回復。
A:性能優(yōu)化方面,可以從如下幾個層次考慮
1. Java編程的代碼風格,比如盡量使用String直接量、避免多次重復new實例,使用位移運算代替乘、除運算等等。
2. 從持久層考慮,優(yōu)化底層數(shù)據(jù)庫設計,比如建索引、分表存儲等,同時對查詢語句進行調優(yōu)。
3. 從數(shù)據(jù)緩存方面著手。采用適當?shù)木彺娌呗裕梢詼p少與底層數(shù)據(jù)庫的交互次數(shù)。
4. 采用“靜態(tài)響應”,服務器可以采用頁面緩存技術,將經(jīng)常被請求的頁面做成靜態(tài)緩存,避免每次請求都需要重新生成響應頁面。
5. 提升服務器性能,可以考慮使用cluster,增加負載均衡、fail over等。
Q:我挺討厭Hibernate的,Hibernate把程序員和數(shù)據(jù)庫隔離了,長久使用Hibernate的程序員雖然能夠快速 開發(fā),但是寫出來的代碼的執(zhí) 行效率很低,比不上jdbc直接操作mysql,我認為Struts +Spring +jdbc就夠了,我面試的很多程序員對數(shù)據(jù)庫一無所知,對于程序優(yōu)化不知道如何優(yōu)化,完全是代碼堆砌。不知道老師對Hibernate是如何理解的?
A:我十分認同你的觀點!早幾年我甚至在網(wǎng)絡上、其他培訓機構過來的學生聽到一個觀點:有了Hibernate,以后就不需要JDBC了。當時我就極力駁斥這種觀點。
但Hibernate也不需要被“深惡痛絕”,關鍵在于你怎么使用它,因為Hibernate同樣存在性能優(yōu)化。
就像我在講授Hibernate時,總是打開SQL調試選項,這樣就可以實時觀察Hibernate為我們做到每一個事情,從而可以進行“針對性的”優(yōu)化。
實際上,Hibernate在性能優(yōu)化上做了不少努力:比如Hibernate的延遲加載(本質就是動態(tài)代理模式)、更新之前的狀態(tài)檢查,Session 級別的一級緩存,SessionFactory級別的二級緩存,如果好好利用這些特性,Hibernate比單純用JDBC性能要更好(注意這里說的是, 單純用JDBC。因為JDBC用得好,同樣可以實現(xiàn)緩存、延遲加載、更新之前的狀態(tài)檢查 等機制)。
其實看到你的“討厭”,我有非常深的體會——我甚至勸告初學者開始學java時不要用JBuilder(早期)、Eclipse之類工具,因為它們同樣把程序員和真正的Java編程隔離了,導致那些java學習者離開IDE工具之后、甚至換一個IDE工具都會無所適從。
——所以我的建議是,初學者先不要使用IDE工具。等你真正明白你在IDE工具里每點一次菜單、每按一個按鈕……IDE工具為了做了什么, 為什么 要做這 些東西之后,再去使用IDE工具,這時候就可以隨意地在各種IDE工具之間自由切換,從而做到:沒有IDE工具可以做得很好,有IDE工具可以開發(fā)的很 快;也會自己開發(fā)一些IDE插件來更大程度地加速開發(fā)。
Q:李老師,您好!首先,非常感謝您寫的書,使我進入了Java EE開發(fā)的世界,讓我快速的了解了Java EE,并且成功的做出了兩個小的項目了,目前有一個稍微大點的項目還正在進行中。我現(xiàn)在就說說我的困惑吧,希望李老師能幫忙解惑,謝謝了。
我的問題分為以下幾點:
1。由于項目屬于沒有人帶,完全自己摸索著做的那種,我不知道 自己的設計是否規(guī)范,是否 安全,效率是否高,因為我的項目數(shù)據(jù)量也比較小,邏輯關系也不是很復雜,現(xiàn)在,手頭正在進行的這個項目,關系有點復雜,隱隱約約的感覺有些吃力。我們的項 目團隊就那么幾個人,我們都是學生,個人感覺我們開發(fā)出來的項目都比較的山寨,做項目的出發(fā)點就是把功能做出來,而不管里面的代碼有多么的丑陋,多么的糟 糕,多么的沒有擴展性、不能重用等問題,這些問題我個人歸結于一點就是規(guī)范性,我不知道該怎么來規(guī)范我的開發(fā),我的小團隊。
2.項目中出了問題的解決之道
雖然到目前為止,項目中出現(xiàn)了各種各樣的問題,比較幸運的是, 目前好像都解決了,這里用 了"好像"這個詞,因為有些個問題,其實說解決了也算解決了,但是仔細較真的話,那就是沒解決了。個人解決問題的方式一般是:①CSDN發(fā)帖子②QQ群詢 問③google 再就沒其他的途徑了,和團隊的其他成員也沒啥好溝通的,主要是因為跟團隊里面的人員溝通都比較的費力,而且感覺更是浪費時間。
鑒于上述幾種途徑也有比較多的缺陷,所以,這里詢問李老師,當碰到了自己不會的問題怎么辦,怎么做到有一個指導方向,快速的解決問題。而不是浪費大量的時間去發(fā)帖子,等回復。
3.我們目前開發(fā)的項目中存在的問題
由于開發(fā)的是些ERP之類的小系統(tǒng),所以對于網(wǎng)絡編程、多線程等接觸的很少,感覺還是有必要做一做這方面的事情,但是感覺使用SSH框架接觸這些東西的概率很小是吧,也不知道是不是我思考的太狹隘了。
謝謝李老師。盼回復。
A:1. 規(guī)范這個東西,一方面可以借助于一些網(wǎng)絡上流行的、有些公司暴露的規(guī)范,另一方面也可以根據(jù)自己的思考、總結制訂一些約定。但如果希望更高層次的規(guī)范,只能去參加一些國際上通用的軟件行業(yè)規(guī)范,但這些對你們小公司可能并不臺適合吧。
2. 遇到問題的解決方法,就看你對技術的把握程度了。一般來說,我遇到問題也是先google看看,找不到再仔細查看下它的manul、guide之類,還找不到解決方法再登錄相關jira找找,還解決不了再跟蹤源代碼看看底層細節(jié)——按這個思路基本都能解決了。
3. 沒錯。你說的多線程、網(wǎng)絡通信、反射這些都是Java基礎,都需要扎實掌握。
Q:你好,李老師:
我做java快兩年了,平時的工作也就是用一些框架快速完成開發(fā)任務而已,感覺學東西都是跟著項目走的,學的也很淺,也很被動,您能給一些提升能力的建議嗎?作為一個java開發(fā)人員,應該怎樣規(guī)劃自己的發(fā)展道路?
我自個覺得一個項目中數(shù)據(jù)是重要的一塊,所以會多關注一些數(shù)據(jù)庫的東西,我這樣的看法對嗎?如果是對的,從項目的角度出發(fā),我應該學習數(shù)據(jù)庫的哪些知識呢?又該怎樣學習?
期待您的回復!
謝謝
A:有一定道理的??梢赃@樣說,所以IT技術都是以數(shù)據(jù)為核心的。
所有開發(fā)人員,都需要在企業(yè)里完成企業(yè)項目——這是我們領工資后必須做的事情。但作為一個有想法、希望提高的程序員,不能僅僅滿足于完成公司的項 目,而是 應該盡量在項目開發(fā)中體現(xiàn)自己的設計理念:多換幾種實現(xiàn)方式,思考如何讓自己可以“更懶”——盡可能把自己所做的項目進行“通用化”,把項目中通用代碼與 業(yè)務代碼分離開,把通用代碼抽取出來簡化后面項目的開發(fā)。
并思考讓代碼更加優(yōu)雅、更加簡潔?以及如何讓項目后期修改、升級時,如何改動最小?
數(shù)據(jù)庫的學習,掌握通用的SQL語法、數(shù)據(jù)庫管理之后,可以在數(shù)據(jù)庫性能監(jiān)控、性能調優(yōu)上多化精力。
Q:老師您好。
是不是在實際的開發(fā)中,一定要掌握和運用Struts +Spring +Hibernate等等這些核心呢?
我也可以用到其中的某一個去完成一件事。
Struts +Spring +Hibernate等等這些核心的優(yōu)缺點在哪里?如何能更好的掌握?在何種開發(fā)環(huán)境下用最合適?煩請老師解答.
A:其實并不是一定要用Struts2+Spring+Hibernate,只是說這種組合具有很大的通用型。說得簡單點,這種組合是一種無需選擇、無需評估的組合,很多公司,很多項目都在用,它具有穩(wěn)定性高、可擴展性好的特點。
對于Hibernate來說,它作為一種持久化技術,主要的功能在于允許用戶以面向對象的方式來操作數(shù)據(jù)庫;但對于大批量、集中的數(shù)據(jù)訪問操作,性能上并沒有任何優(yōu)勢。遇到這種場景,可以選擇使用MyBatis來代替Hibernate。
掌握Struts2+Spring+Hibernate整合開發(fā)的方法,可以參考《輕量級Java EE企業(yè)應用實戰(zhàn)》。
本文出自 “51CTO技術門診” 博客,請務必保留此出處http://doctor.blog.51cto.com/939235/882833