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