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