業(yè)務場景篇
Spring的概述
?????Spring是完全面向接口的設計雕擂,降低程序耦合性壮韭,主要是事務控制并創(chuàng)建bean實例對象。在ssh整合時员串,充當黏合劑的作用。IOC(Inversion of Control) 控制反轉(zhuǎn)/依賴注入昼扛,又稱DI(Dependency Injection) (依賴注入)??
IOC的作用:產(chǎn)生對象實例寸齐,所以它是基于工廠設計模式的
Spring IOC的注入
? 通過屬性進行注入,通過構(gòu)造函數(shù)進行注入,
? 注入對象數(shù)組注入List集合 ??
? 注入Map集合 ?????注入Properties類型
Spring IOC自動綁定模式:
????????可以設置autowire按以下方式進行綁定
????????按byType只要類型一致會自動尋找渺鹦, ???????????
????????按byName自動按屬性名稱進行自動查找匹配.
AOP面向方面(切面)編程
AOP是OOP的延續(xù)扰法,是Aspect Oriented Programming的縮寫,意思是面向方面(切面)編程海铆。
注:OOP(Object-Oriented Programming )面向?qū)ο缶幊?/p>
AOP主要應用于日志記錄迹恐,性能統(tǒng)計,安全控制,事務處理(項目中使用的)等方面卧斟。
Spring中實現(xiàn)AOP技術:
在Spring中可以通過代理模式來實現(xiàn)AOP
代理模式分為
靜態(tài)代理:一個接口,分別有一個真實實現(xiàn)和一個代理實現(xiàn)憎茂。
動態(tài)代理:通過代理類的代理珍语,接口和實現(xiàn)類之間可以不直接發(fā)生聯(lián)系,而可以在運行期(Runtime)實現(xiàn)動態(tài)關聯(lián)竖幔。
動態(tài)代理有兩種實現(xiàn)方式板乙,可以通過jdk的動態(tài)代理實現(xiàn)也可以通過cglib來實現(xiàn)而AOP默認是通過jdk的動態(tài)代理來實現(xiàn)的。jdk的動態(tài)代理必須要有接口的支持募逞,而cglib不需要放接,它是基于類的。
Spring AOP事務的描述:
在spring-common.xml里通過<aop:config>里面先設定一個表達式留特,設定對service里那些方法 ?如:對add* ,delete*,update*等開頭的方法進行事務攔截蜕青。我們需要配置事務的傳播(propagation="REQUIRED")特性,通常把增,刪,改以外的操作需要配置成只讀事務(read-only="true").只讀事務可以提高性能苟蹈。之后引入tx:advice,在tx:advice引用 transactionManager(事務管理),在事務管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通過<aop:config> 引入txAdvice慧脱。
Spring實現(xiàn)ioc控制反轉(zhuǎn)描述:
原來需要我們自己進行bean的創(chuàng)建以及注入菱鸥,而現(xiàn)在交給spring容器去完成bean的創(chuàng)建以及注入采缚。
所謂的“控制反轉(zhuǎn)”就是 對象控制權(quán)的轉(zhuǎn)移挠他,從程序代碼本身轉(zhuǎn)移到了外部容器。
官方解釋:
控制反轉(zhuǎn)即IoC (Inversion of Control)镰烧,它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交給容器怔鳖,通過容器來實現(xiàn)對象組件的裝配和管理结执。所謂的“控制反轉(zhuǎn)”概念就是對組件對象控制權(quán)的轉(zhuǎn)移献幔,從程序代碼本身轉(zhuǎn)移到了外部容器。
事務概述 √
????在數(shù)據(jù)庫中,所謂事務是指一組邏輯操作單元即一組sql語句趾诗。當這個單元中的一部分操作失敗,整個事務回滾恃泪,只有全部正確才完成提交贝乎。
事務的ACID屬性
1.原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位糕非,事務中的操作要么都發(fā)生朽肥,要么都不發(fā)生衡招。
2.一致性(Consistency)
事務必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)始腾。(數(shù)據(jù)不被破壞)
3.隔離性(Isolation)
事務的隔離性是指一個事務的執(zhí)行不能被其他事務干擾.
4.持久性(Durability)
持久性是指一個事務一旦被提交穗椅,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的.即使系統(tǒng)重啟數(shù)據(jù)也不會丟失;在JDBC中匹表,事務默認是自動提交的袍镀,每次執(zhí)行一個SQL語句時苇羡,如果執(zhí)行成功设江,就會向數(shù)據(jù)庫自動提交叉存,而不能回滾
為了讓多個SQL語句作為一個事務執(zhí)行:
(1)執(zhí)行語句前調(diào)用 Connection 對象的 setAutoCommit(false);
以取消自動提交事務
(2)在所有的 SQL 語句都成功執(zhí)行后鹉胖,調(diào)用 commit(); 方法提交事務
(3)在出現(xiàn)異常時甫菠,調(diào)用 rollback(); 方法回滾事務寂诱。
權(quán)限概述
??????????權(quán)限涉及到5張表:
用戶表痰洒,角色表丘喻,權(quán)限表(菜單表)泉粉,用戶角色關聯(lián)表嗡靡,角色權(quán)限關聯(lián)表
當用戶登錄時讨彼,根據(jù)用戶名和密碼到用戶表驗證信息是否合法哈误,如果合法則獲取用戶信息黑滴,之后根據(jù)用戶id再到用戶角色關聯(lián)表中得到相關連的角色id集合,之后根據(jù)角色id再到角色權(quán)限關聯(lián)表中獲取該角色所擁有的權(quán)限id集合菜谣,然后再根據(jù)權(quán)限id集合到權(quán)限表(菜單表)中獲取具體的菜單尾膊,展現(xiàn)給當前登錄用戶冈敛,從而達到不同用用戶看到不同的菜單權(quán)限抓谴。
我們通過ZTree來給角色賦權(quán)并且通過ZTree來展示菜單癌压,以及通過ZTree來管?理菜單即增加和編輯菜單滩届。
我們做的權(quán)限控制到url級別,為了防止用戶不登錄直接輸入url訪問的這個弊端帜消,通過攔截器進行攔截驗證泡挺。
OSCache業(yè)務場景
??????在我以前的項目中,我們考慮了系統(tǒng)性能問題稚新,這個時候我們采用了Oscache緩存褂删,剛開始把這個功能交給了項目組中的另外一個同事來做的屯阀,但是他做完的時候他發(fā)現(xiàn)緩存中明明已經(jīng)緩存了數(shù)據(jù)难衰,但是在取得時候發(fā)現(xiàn)沒有數(shù)據(jù)盖袭,我們項目經(jīng)理讓我去幫忙看看這個問題弟塞,我閱讀完他的代碼之后决记,我發(fā)現(xiàn)了他每次緩存的時候都是調(diào)用一個新的緩存對象的方法系宫,結(jié)果出現(xiàn)了明明已經(jīng)走了緩存的方法而取不到數(shù)據(jù)的問題笙瑟,通過我多年的工作經(jīng)驗,我就想到了應該用單例模式去封裝一個單例工具類來調(diào)用oscache凄杯。但是,在后來的測試過程中膊存,發(fā)現(xiàn)當并發(fā)訪問的時候也會出現(xiàn)上述的問題隔崎,這個時候我直接采取的DCL(雙重判定鎖)單例模式封裝了工具類爵卒,既解決了線程安全問題钓株,相對的性能問題也考慮到了,這個問題才得到了完善的解決亚铁。
線程概述
????線程的狀態(tài)以及狀態(tài)之間的相互轉(zhuǎn)換:
? 1、新建狀態(tài)(New):新創(chuàng)建了一個線程對象携栋。
2婉支、就緒狀態(tài)(Runnable):線程對象創(chuàng)建后向挖,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中溶推,變得可運行蒜危,等待獲取CPU的使用權(quán)辐赞。
3响委、運行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼贝次。
4蛔翅、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán)山析,暫時停止運行秆剪。直到線程進入就緒狀態(tài)仅讽,才有機會轉(zhuǎn)到運行狀態(tài)洁灵。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執(zhí)行wait()方法双抽,JVM會把該線程放入等待池中牍汹。
(二)柑贞、同步阻塞:運行的線程在獲取對象的同步鎖時棠众,若該同步鎖被別的線程占用闸拿,則JVM會把該線程放入鎖池中揽趾。
(三)篱瞎、其他阻塞:運行的線程執(zhí)行sleep()或join()方法俐筋,或者發(fā)出了I/O請求時笆呆,JVM會把該線程置為阻塞狀態(tài)赠幕。當sleep()狀態(tài)超時榕堰、join()等待線程終止或者超時、或者I/O處理完畢時康二,線程重新轉(zhuǎn)入就緒狀態(tài)沫勿。
5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法蔓挖,該線程結(jié)束生命周期。
實現(xiàn)線程的兩種方式:
是繼承Thread類或?qū)崿F(xiàn)Runnable接口拷获,但不管怎樣匆瓜,當new了這個對象后茧妒,線程就已經(jīng)進入了初始狀態(tài)
wait和sleep的區(qū)別:
線程訪問:
鎖池狀態(tài),之后等待鎖釋放九昧,然后訪問代碼
wait
等待隊列(釋放資源)--->調(diào)用notify或者notifyall之后鎖池狀態(tài)--->( 等待鎖釋放)--->可運行狀態(tài)--->運行狀態(tài)---->訪問代碼
sleep,join
不釋放資源-->結(jié)束后直接進入可運行狀態(tài)--->運行狀態(tài)---->訪問代碼
一個java控制臺程序铸鹰,默認運行兩個線程,一個主線程剖毯,一個垃圾回收線程。
線程與進程的區(qū)別:
1.線程(Thread)與進程(Process)
進程定義的是應用程序與應用程序之間的邊界胶滋,通常來說一個進程就代表一個與之對應?????的應用程序。不同的進程之間不能共享代碼和數(shù)據(jù)空間部宿,而同一進程的不同線程可以共?????享代碼和數(shù)據(jù)空間。
2.一個進程可以包括若干個線程,同時創(chuàng)建多個線程來完成某項任務藏雏,便是多線程赚瘦。
Ajax請求Session超時問題
?????我在做項目時有時會遇到session超時問題起意,如果session超時,平常請求沒有什么問題亲善,通過攔截器可以正確跳到登陸頁面蛹头,可是你如果用ajax請求的話這就出現(xiàn)問題了渣蜗,因為ajax是異步的,局部刷新斑胜,所以登陸界面不會再全頁面中顯示,他只會顯示到頁面的一部分當中凭戴。所以根據(jù)我這幾年的經(jīng)驗找到了我認為比較好的一種方法炕矮。因為那我用的框架是和struts2集成的么夫,所以就在攔截器中進行設置:
首先判斷session是否為空就是判斷session是否超時,如果超時就取出請求的head頭信息request.getHeader("x-requested-with")肤视,如果不為空就和XMLHttpRequest(Ajax標識)進行比較 (request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest"))) 如果相等說明此請求是ajax請求档痪。
如果是ajax請求就可以用response.setHeader("鍵","值")來設置一個標識來告訴用戶這是ajax請求并且session超時時發(fā)出的,這樣我就可以在回調(diào)函數(shù)中取出自己設置的那個唯一標識:XMLHttpRequest.getResponseHeader("");如果取出的值是和自己在后臺中設置的值一樣的話腐螟,就證明session已經(jīng)超時,這樣就可以設置window.location.replace("登陸界面"),來跳轉(zhuǎn)到登陸界面了乐纸。
這樣做雖然解決了問題衬廷,但是,會在每個回調(diào)函數(shù)中寫入那些代碼汽绢,這樣的話代碼就會顯得特別零散吗跋,所以就想能不能定義一個全局的設置所以就找到了jqery的ajaxSetUp方法,通過ajaxSetUp對jqery的ajax進行全局的判斷(ajaxSetUp就相當于ajax的攔截器)宁昭,通過設置ajaxSetUp里的complete跌宛,它就相當于回調(diào)函數(shù),這樣那就彌補了上一方法的不足久窟。
我做項目時還用到$(document).ajaxStart()秩冈,這是ajax請求時的事件;$(document).ajaxSuccess()斥扛,這是AJAX請求成功后的事件入问。我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓用戶重復提交,更提高了用戶體驗度稀颁,讓用戶知道已經(jīng)提交了芬失。
java線程池概述
java線程池的工作原理和數(shù)據(jù)庫連接池的差不多,因為每次重新創(chuàng)建線程都是很耗資源的操作匾灶,所以我們可以建立一個線程池棱烂,這樣當需要用到線程進行某些操作時,就可以直接去線程池里面找到空閑的線程阶女,這樣就可以直接使用颊糜,而不用等到用到的時候再去創(chuàng)建,用完之后可以把該線程重新放入線程池供其他請求使用從而提高應用程序的性能秃踩。
線程池的核心流程:
1.構(gòu)建一個 ThreadPoolExecutor 并指定默認要創(chuàng)建的線程的數(shù)量
2.通過 threadPool.execute()
去添加一個個要執(zhí)行的線程即實現(xiàn)了Runable接口的java類
3.在實現(xiàn)了Runable接口的java類的run方法中寫入具體的業(yè)務代碼
線程池的業(yè)務場景:
我在工作的時候衬鱼,當時一個同事給我提了一個需求,目前有大量的圖片需要處理生產(chǎn)縮略圖并進行加水印憔杨,因為按照普通的處理方法一個個的進行處理太慢了鸟赫,問我有沒有好的解決方案,這個時候我就想到了java中的線程池消别,我構(gòu)建了一個線程數(shù)為5個線程池抛蚤,然后采用分段批量提取的方式每500條為一組數(shù)據(jù)進行圖片信息的提取,然后再把這些通過Threadpool的execute方法交給線程池中的線程進行處理寻狂,即充分使用CPU硬件資源又加快了大數(shù)據(jù)情況下程序的處理效率岁经。
我當時在工作的過程中,認識一個做電商的朋友蛇券,他們當時公司才起步缀壤,很多技術都不成熟朽们,所以就常常和我探討一些技術問題,有次他向我請教一個問題诉位,問我如何才能提高網(wǎng)站的性能,我根據(jù)自己在項目中的經(jīng)驗以及自己以前閱讀的關于優(yōu)化方面的資料給他提出了很多建議菜枷,如用lucene進行全文檢索苍糠,用memcached進行分布式緩存,以及通過spring定時器結(jié)合freeMarker模板引擎來生成靜態(tài)頁面啤誊,由于要生成的頁面的數(shù)量比較多岳瞭,考慮到程序的性能,我建議他結(jié)合java的線程池進行工作蚊锹,這樣就可以充分使用了CPU硬件資源又加快了大數(shù)據(jù)情況下程序的處理效率瞳筏。
如果你依然覺得有些茫然,不如加入我的Java架構(gòu)師之路:766529531?跟有多年Java開發(fā)經(jīng)驗的資深工程師聊一聊牡昆。也可獲取免費的視頻學習資料以及電子書學習資料喔姚炕!
OSCache概述
oscache是一個高性能的j2ee框架,可以和任何java代碼進行集成丢烘,并且還可以通過標簽對頁面內(nèi)容進行緩存柱宦,還以緩存請求。我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進行緩存播瞳。為了保證緩存數(shù)據(jù)的有效性掸刊,在數(shù)據(jù)發(fā)生改變的時候,我們要刷新緩存赢乓,避免臟數(shù)據(jù)的出現(xiàn)忧侧。刷新緩存的策略有兩種,一種是定時刷新牌芋,一種手動刷新蚓炬。緩存數(shù)據(jù)的時機通常也分為兩種,即在tomcat(web容器)啟動時候加載數(shù)據(jù)進行緩存姜贡,另外也可以在用戶第一次訪問數(shù)據(jù)的時候進行緩存试吁,這個相當于緩存的立即加載和按需加載。
緩存的層次如下:jsp-->action-->service-->dao,緩存越靠前對性能的提升越大楼咳,一個action里面可以有多個service,一個service中可以有多個dao或者多個service熄捍,任何類之間都可以進行相互調(diào)用,可以通過構(gòu)造函數(shù)傳參母怜,set,get傳參或者是方法傳???參將相關的類連接起來余耽。
OSCache+autocomplete+單例業(yè)務場景
??????在我以前做某項目的過程中,其中我們在做產(chǎn)品列表的查詢的時候為了提高用戶的體驗度苹熏,我們使用了autocomplete插件來代替select進行品牌的選擇碟贾,才開始的時候每次都要根據(jù)用戶輸入的信息去查詢數(shù)據(jù)庫進行模糊匹配返回結(jié)果币喧,后來我們考慮到系統(tǒng)的性能,因此我們采用了oscache緩存袱耽,才開始這個功能是交給我們項目組中的另外一個同事來做的杀餐,但是他做完后,我們在使用這個工具類的時候朱巨,發(fā)現(xiàn)有時緩存中明明已經(jīng)有時我們需要的數(shù)據(jù)史翘,但是從緩存里面取的時候,發(fā)現(xiàn)沒有冀续,之后項目經(jīng)理讓我去幫這個同事看看這個問題琼讽,我經(jīng)過閱讀他的代碼發(fā)現(xiàn),它里面在使用緩存的時候洪唐,針對于每次方法的調(diào)用都產(chǎn)生一個新的實例钻蹬,結(jié)果導致了上面的問題,這個時候我想起了可以使用設計模式中的單例模式來解決這個問題凭需,才開始我直接采用了普通的單列模式问欠,但是后來在測試的過程中,發(fā)現(xiàn)當用戶并發(fā)量大的時候還是會出現(xiàn)上面的問題粒蜈,之后我再次考慮了代碼溅潜,最后發(fā)現(xiàn)是因為沒有給單列模式加鎖的原因,從而導致了大用戶并發(fā)的時候薪伏,線程安全的問題滚澜,之后我便在方法上加上了synchronized關鍵字,解決上述的問題嫁怀,但是后來測試人員反饋设捐,覺的這段的性能有問題,我考慮之后便采用在方法體內(nèi)加鎖并結(jié)合雙重判定的方式解決了上面的問題塘淑。我們是將數(shù)據(jù)在tomcat啟動的時候加載到緩存中萝招,之后用戶進行查詢的時候直接從緩存中獲取數(shù)據(jù),根據(jù)前綴匹配進行查詢存捺,將結(jié)果返回給用戶槐沼。這樣在提高用戶體驗度的同時也提高性能。
緩存概述
應用程序為了提高性能捌治,可以通過使用緩存來達到目的岗钩,緩存的存儲介質(zhì)可以內(nèi)存或者硬盤,通常將數(shù)據(jù)存儲在內(nèi)存里肖油,確切的說是jvm的內(nèi)存中兼吓,緩存是基于Map這種思想構(gòu)建的,以鍵值對的方式進行存取森枪,之所以還可以將緩存的數(shù)據(jù)存儲在硬盤中视搏,是因為內(nèi)存資源相當有限和寶貴审孽,所以當內(nèi)存資源不足的時候,就可以將其存儲到硬盤中浑娜,雖然硬盤的存取速度比內(nèi)存要慢佑力,但是因為減少了網(wǎng)絡通信量,所以還是提高程序的性能筋遭。緩存可以分為客戶端緩存和服務器端緩存搓萧,所謂的客戶端緩存通常指的是IE瀏覽器的緩存,服務器端緩存指的web服務器的緩存宛畦,通常可以通過第三方組件實現(xiàn)揍移,如oscache,memcache
我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進行緩存次和。為了保證緩存數(shù)據(jù)的有效性,在數(shù)據(jù)發(fā)生改變的時候那伐,我們要刷新緩存踏施,避免臟數(shù)據(jù)的出現(xiàn)。刷新緩存的策略有兩種罕邀,一種是定時刷新畅形,一種手動刷新。
緩存的層次如下:jsp-->action-->service(通常放置在service)-->dao,緩存越靠前對性能的提升越大
緩存的策略:(緩存空間不足需要進行清理的時候使用)
LRU:最近最少使用原則.(理解:存儲書)
FIFO:先進先出的緩存策略.(理解:排隊)
你來說說緩存诉探?說說你對緩存的理解(如果遇到重復的日熬,就可以省略)
我們在項目中使用緩存的目的是為了提高應用程序的性能,減少訪問數(shù)據(jù)庫的次數(shù)肾胯,從而提高應用程序的吞吐量竖席。我們通常將權(quán)限,菜單,組織機構(gòu)這些頻繁訪問但是不經(jīng)常改變的基礎數(shù)據(jù)進行緩存敬肚,其中我在做()某某項目的時候就通過oscache對ZTree的樹形菜單進行了緩存毕荐,并且在做的時候和單列設計模式進行結(jié)合,考慮到多線程下的安全問題艳馒,還對單例模式加入了雙重判定鎖的檢查方式憎亚。
實現(xiàn)頁面靜態(tài)化業(yè)務場景
我們在做某項目時,涉及到程序訪問的性能問題弄慰,這時候我們想到可以通過靜態(tài)化來提高用戶訪問時候的性能第美,所以我們就采用了freemarker模板引擎,考慮到頁面也是要有動態(tài)的變化的陆爽,所以我們采用spring定時器在每天晚上2點鐘的時候定時再次生成html靜態(tài)頁面斋日,考慮發(fā)布時候的性能問題,我們又采取線程池技術墓陈,讓多個線程同時發(fā)布恶守,從而縮減發(fā)布時間第献。
servlet線程安全描述
servlet是單列的,對于所有請求都使用一個實例兔港,所以如果有全局變量被多線程使用的時候庸毫,就會出現(xiàn)線程安全問題。
解決這個問題有三種方案:
1.實現(xiàn)singleThreadModel接口衫樊,這樣對于每次請求都會創(chuàng)建一個新的servlet實例飒赃,這樣就會消耗服務端內(nèi)存,降低性能科侈,但是這個接口已經(jīng)過時载佳,不推薦使用。
2.可以通過加鎖(synchroniezd關鍵字)來避免線程安全問題臀栈。這個時候雖然還是單列蔫慧,但是對于多線程的訪問,每次只能有一個請求進行方法體內(nèi)執(zhí)行权薯,只有執(zhí)行完畢后姑躲,其他線程才允許訪問,降低吞吐量盟蚣。
3.避免使用全局變量黍析,使用局部變量可以避免線程安全問題,強烈推薦使用此方法來解決servlet線程安全的問題屎开。
(jbpm4)工作流引擎描述:
JPBM是JBOSS旗下的一個開源的基于hibernate的工作流引擎阐枣。工作流就是在日常生活中,我們一些常見的如請假流程奄抽、采購流程侮繁、入職流程,通俗的來講就是一些在現(xiàn)實生活中的流程以信息化以程序的方式實現(xiàn)如孝。
一個工作流首先需要進行流程定義宪哩,流程定義是由節(jié)點和跳轉(zhuǎn)組成的,節(jié)點又可以稱為環(huán)節(jié)第晰、活動節(jié)點锁孟、活動環(huán)節(jié),并且節(jié)點也可以分為兩大類型:人工節(jié)點和自動節(jié)點茁瘦,人工節(jié)點有start開始節(jié)點品抽、end結(jié)束節(jié)點、task任務節(jié)點甜熔,自動節(jié)點有decision判斷節(jié)點圆恤、fork分支節(jié)點、join聚合節(jié)點和state狀態(tài)節(jié)點腔稀,并且一個流程有且只有一個開始節(jié)點盆昙,但可以有多個結(jié)束節(jié)點羽历。
流程定義是靜止的,它在運行狀態(tài)時會轉(zhuǎn)換成流程實例淡喜,一個流程定義可以對應多個流程實例秕磷。流程運行后,會產(chǎn)生兩個文件炼团,*.jdpl.xml文件和*.png圖片文件澎嚣,也會生成18張數(shù)據(jù)庫表,常用且核心的表有JBPM4_LOB 存儲表瘟芝,主要存儲xml文件和png圖片易桃、JBPM4_TASK 任務表、JBPM4_EXECUTION 流程實例表锌俱、JBPM4_VARIABLE變量表晤郑。
圖形化的靈活定制(主動說)
可以根據(jù)需求進行流程圖的改變的,即定義的流程圖是可以根據(jù)需要改變的嚼鹉,而不是死的。
可以進行圖形化的監(jiān)控(主動說)
輸出圖片
獲取活動節(jié)點的坐標
進行疊加
判斷節(jié)點:(主動說驱富,也可以了解)
實現(xiàn)implements DecisionHandler接口并重寫decide方法,
返回的字符串要和xml中配置的transition的name保持一致锚赤。
分支判定節(jié)點
JBPM有五大核心類:
????????ProcessEngine:主要獲取各種的Service
????????RepositoryService:主要發(fā)布流程定義
????????ExecutionService:主要操作流程實例
????????TaskService:主要操作人工服務
????????HistoryService:主要操作歷史服務。
核心方法:
讀取jbpm定義的文件生成zip包存到lob表中:createDeployment()
獲取流程定義列表:createProcessDefinitionQuery
根據(jù)定義的key或id來啟動流程實例:startProcessInstanceByKey(id)
獲取待辦任務列表:findPersonalTasks(userName)
完成指定任務列表:completeTask(*.getActivityId())
獲取歷史任務列表:createHistoryTaskQuery()
獲取流程實例的ID:task.getExecutionId()
(了解的表)
JBPM4_HIST_ACTINST流程活動(節(jié)點) 實例表
JBPM4_HIST_DETAIL流程歷史詳細表
JBPM4_HIST_PROCINST流程實例歷史表
JBPM4_HIST_TASK流程任務實例歷史表
JBPM4_HIST_VAR流程變量( 上下文) 歷史表
JPBM業(yè)務場景
首先進行請假的流程定義褐鸥,我們流程的定義是(員工提交請假單---》經(jīng)理審批---》總監(jiān)審批---》總經(jīng)理審批---》結(jié)束)线脚,通過repositoryService將其發(fā)布部署到jbpm4_lob表中,
之后獲取流程定義列表叫榕,選中請假的流程定義浑侥,員工開始進行請假單的填寫,保存并通過executionService開啟流程實例晰绎,然后用taskService獲取經(jīng)理的待辦任務列表寓落,選中待辦任務,進行審批荞下,通過調(diào)用taskService.completeTask()進入到總監(jiān)審批環(huán)節(jié)伶选,然后用總監(jiān)進行登錄,同樣獲取待辦任務列表尖昏,然后調(diào)用taskService.completeTask()進入總經(jīng)理審批環(huán)節(jié)仰税,總經(jīng)理審批之后,結(jié)束流程抽诉。在這個過程中我們還可以根據(jù)historyService查看當前登錄人已辦的任務列表陨簇。
Ant描述
Ant是apache旗下的對項目進行自動打包、編譯迹淌、部署的構(gòu)建工具河绽,他主要具有 ????輕量級并且跨平臺的特性己单,而且基于jvm,默認文件名為build.xml
Ant主要的標簽:
Project根標簽葵姥,target任務標簽荷鼠,property屬性標簽,自定義鍵/值 供多次使用榔幸,java執(zhí)行編譯后的java文件允乐,javac編譯java文件,war打成war包削咆,其它標簽:copy牍疏,delete,mkdir拨齐,move鳞陨,echo等。
FreeMarker描述
???????FreeMarker是一個用Java語言編寫的模板引擎瞻惋,它是基于模板來生成文本輸出的通用工具厦滤。Freemarker可以生成HTML, XML歼狼,JSP或Java等多種文本輸出掏导。
工作原理:定義模板文件,嵌入數(shù)據(jù)源羽峰,通過模板顯示準備的數(shù)據(jù)
(數(shù)據(jù) + 模板 = 輸出)
我們在使用模板中發(fā)現(xiàn)freemarker具有許多優(yōu)點趟咆,它徹底的分離表現(xiàn)層和業(yè)務邏輯,模板只負責數(shù)據(jù)在頁面中的表現(xiàn)梅屉,不涉及任何的邏輯代碼值纱,所以使得開發(fā)過程中的人員分工更加明確,作為界面開發(fā)人員坯汤,只需專心創(chuàng)建HTML文件虐唠、圖像以及Web頁面的其他可視化方面,不用理會數(shù)據(jù)惰聂;而程序開發(fā)人員則專注于系統(tǒng)實現(xiàn)凿滤,負責為頁面準備要顯示的數(shù)據(jù)。
如果使用jsp來展示庶近,開發(fā)階段進行功能調(diào)適時翁脆,需要頻繁的修改JSP,每次修改都要編譯和轉(zhuǎn)換鼻种,浪費了大量時間反番,F(xiàn)reeMarker模板技術不存在編譯和轉(zhuǎn)換的問題,在開發(fā)過程中,我們在不必在等待界面設計開發(fā)人員完成頁面原型后再來開發(fā)程序罢缸。由此使用freemarker還可以大大提高開發(fā)效率篙贸。
webService描述
(主動說)
webservice是SOA(面向服務編程)的一種實現(xiàn),主要是用來實現(xiàn)異構(gòu)平臺通信也就是不同平臺不同項目之間的數(shù)據(jù)傳輸枫疆,從而避免了信息孤島的問題爵川,它之所以能夠進行異構(gòu)平臺通信是因為它是完全基于xml的,所以說息楔,webService是跨平臺寝贡,跨語言,跨框架的值依,在java中通常有三種技術框架分別是xfire,cxf,axis2圃泡。
我們?yōu)榱吮WC
webservice的安全性,采用了基于
WS-Security標準的安全驗證(使用回調(diào)函數(shù))愿险。
(沒必要主動說)
webservice的三要素分別是:
? ? ? wsdl(webservice description language)用來描述發(fā)布的接口(服務)
? ? ? soap(simple object access protocol)是xml和http的結(jié)合颇蜡,是webservice數(shù)據(jù)通信的協(xié)議
? ? ? uddi用來管理,查詢webService的服務
(沒必要主動說)
webservice的具體三種實現(xiàn)方式(框架)或者三種實現(xiàn)框架的區(qū)別
? ? ? 1. Axis2:可以用多種語言開發(fā)辆亏,是一個重量級框架风秤,功能非常強大,但是它的性能比較低扮叨。
? ? ? 2. Xfire:它相比Axis2來說是一個輕量級框架缤弦,它的性能要比Axis2高。
? ? ? 3. cxf:是Xfire的升級版甫匹,就好比是甸鸟,struts2是webwork的升級惦费,然后cxf和spring集成起來非常方便兵迅,簡易,性能方面也要比Xfire高薪贫。
【注】jdk6自帶的webservice ?jws
(主動說)
業(yè)務場景
我在以前做項目的時候,其中遇到一個功能,需要進行兩個項目之間的數(shù)據(jù)的傳輸腰根,項目經(jīng)理讓我去完成這個任務累澡,我根據(jù)以往的項目經(jīng)驗,想到兩種解決方案鞍匾,第一種就是開放另外一個項目的數(shù)據(jù)庫的權(quán)限給我交洗,然后我直接通過訪問另外一個項目的數(shù)據(jù)庫,來得到需要的信息橡淑,但后來我分析了下构拳,覺的這種方式不安全,而且因為當時這個項目是另外一家公司負責在做,所以數(shù)據(jù)庫里面的表結(jié)構(gòu)置森,
以及以后牽涉
到的責任問題都很多斗埂,所以我就采用了第二種方案,即通過webservices的方式凫海,進行異構(gòu)系統(tǒng)之間數(shù)據(jù)信息的傳遞呛凶,webservices的具體實現(xiàn),有xfire,cxf,axis2,我根據(jù)以往的項目經(jīng)驗行贪,了解到cxf是xfire的升級版本漾稀,適用于java語言,xfire/cxf性能比axis2要高瓮顽,并且和spring整合起來也比較方便县好,而axis2支持更多的語言,性能相對于cxf要低暖混,通過上面分析缕贡,結(jié)合我們目前的兩個項目都是基于java語言的,所以我采用cxf這種方式實現(xiàn)了兩個項目之間數(shù)據(jù)的傳遞拣播,我們?yōu)榱吮WCwebservice的安全性我們采用了基于WS-Security標準的安全驗證(使用CXF回調(diào)函數(shù))晾咪。
(沒必要主動說)
webservice服務端配置流程
首先在web.xml中引入cxfServlet核心類,指定對以/cxf開頭的url路徑提供webservice服務贮配,之后我們在要發(fā)布成webservice接口上添加@Webservice 注解谍倦,而且還要在實現(xiàn)類上添加同樣的webservice注解并且要說明實現(xiàn)了哪個接口,之后在spring-webservice.xml中發(fā)布webservice服務泪勒,通過jaxws:endpoint這個標簽昼蛀,并且在標簽配置implementor和address來表明實現(xiàn)服務的類,以及發(fā)布的地址圆存,最后在瀏覽器中輸入相關的webservice地址?wsdl來驗證服務是否發(fā)布成功叼旋。
(沒必要主動說)
webservice客戶端的配置
首先通過wsdl2java根據(jù)發(fā)布的webservice服務端地址的wsdl生成客戶端調(diào)用的中間橋梁java類,將生成的java類拷貝到客戶端項目中沦辙,配置spring-client.xml文件夫植,通過jaxws:client定義一個bean,并通過address屬性指明要訪問的webservice的服務地址,通過serviceClass指明充當中間橋梁的服務類油讯,之后獲取該bean,就可以通過它來訪問發(fā)布的webservice接口中的方法详民。
oracle索引概述
??索引呢是與表相關的一個可選結(jié)構(gòu),可以提高sql語句的檢索效率陌兑,相當于我們的字典目錄 沈跨,可以快速進行定位 ,所以可以減少磁盤I/O, ??但是因為索引在物理與邏輯上都是獨立于表的數(shù)據(jù) ?它會占用一定的物理空間(額外磁盤空間) ?所以并不是索引越多越好,而我們應該根據(jù)業(yè)務需求去創(chuàng)建索引,而且進行增刪改操作時 oracle又要自動維護索引 ?所以在一定程度上也降低了維護速度兔综,而且我們在創(chuàng)建索引和維護索引要耗費時間饿凛,這種時間隨著數(shù)據(jù)量的增加而增加隅俘,我們一般創(chuàng)建索引呢 ?是這樣創(chuàng)建的 create ?index ?索引名 on ?表名(字段),索引又分為普通索引 唯一索引(unique) ?單個索引 ?復合索引(又叫組合索引笤喳,在索引建立語句中同時可包含多個字段名)为居,順序索引,散列索引,位圖索引杀狡。
oracle存儲過程
存儲過程就是封裝一些sql的集合蒙畴,也就是一條條的sql語句,過程的優(yōu)點就是簡化了sql命令加上它是預編譯的呜象,所以它的執(zhí)行效率和性能較高膳凝,再者,如果不調(diào)用過程的話就要和數(shù)據(jù)庫發(fā)生多次交互恭陡,調(diào)用過程只需傳一個命令所有的那些執(zhí)行邏輯都在數(shù)據(jù)庫端執(zhí)行蹬音,所以說它降低了網(wǎng)絡的通信量,其次休玩,存儲過程大大提高了安全性著淆,這就是優(yōu)點
缺點呢,就是不同的數(shù)據(jù)庫對過程支持的關鍵字支持的關鍵字都是不一樣的拴疤,所以它的移植性是非常差的永部,再者,它的維護性難度也比較大呐矾,因為它沒有專業(yè)的調(diào)試和維護工具苔埋,所以說它維護起來比較麻煩,這就是存儲過程的基本概述.
Junit業(yè)務場景
在我們開發(fā)項目的時候為了提高代碼的性能和保證邏輯正確性蜒犯,在我們編寫代碼后往往都要進行單元測試组橄,來驗證代碼,當時我們公司開發(fā)人員全部使用的main方法來進行驗證罚随,但是使用mian的最大缺點就是不能將多個類同時進行驗證玉工,驗證的結(jié)果不直觀,測試復雜(每個類都要寫main方法毫炉,單個運行)瓮栗,一定程度上浪費時間削罩,所有我和項目經(jīng)理提議使用專業(yè)測試工具Junit來進行測試瞄勾,因為Junit是一個Java語言的單元測試框架 ,測試簡單弥激,不僅可以提供工作效率和代碼的質(zhì)量进陡,也提高團隊的合作能力,我提議后我們進行了Junit的培訓使用Junit4加注解的方式來測試微服。
Apache+Tomcat實現(xiàn)負載均衡及seesion復制
當我們tomcat訪問量大,線程連接數(shù)不夠時,我們考慮到了tomcat的負載均衡來分擔過多的訪問.性能方面負載均衡也能利用多臺tomcat來增大內(nèi)存量,
流程,準備工作apache,Jk_mod,tomcat,在apache的conf/httpd.conf文件中 使用include 標簽引入我們自定義的一個mood_jl.conf,在modules中引入下載的k_mod-apache-X.X.XX.so文件,在其中引入我們的.so,及work.properties文件,及指定負載分配控制器controller,在work.properties文件中worker.list=controller,tomcat1,tomcat2指定service,worker.tomcat1.port ?Ajp端口號,type 是ajp,host為指定ip,lbfactor 指定分配權(quán)重值越大分擔請求越多,worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2 ?指定分擔請求的tomcat Session的復制在tomcat中service.xml中Engine標簽加入 jvmRoute ?值為work,properties中指定的tomcat名稱,然后打開<Cluster標簽的注釋,最后在應用中程序的web.xml文件中增加<distributable/>趾疚。
我們在做這個項目時,我們考慮到服務器性能的問題,我們最開始想到使用縱向擴展糙麦,來增加硬件的配置提高其性能辛孵,但這樣做比較耗費資金,而且服務器內(nèi)存空間也是有限的赡磅;所以后來就想到使用橫向擴展來達到這一目的
當時我們的apache是通過jk借助于ajp協(xié)議與tomcat進行通信的魄缚,在我們不進行負載均衡之前,那所有的請求都由一臺tomcat進行處理焚廊,這樣會使我們的tomcat所承受的壓力增大冶匹,而我們進行負載均衡之后,同樣數(shù)量的請求經(jīng)過apache和jk將其分發(fā)到多臺tomcat進行處理咆瘟,從而降低每臺tomcat所承受的壓力,而且當其中一臺機器宕機時嚼隘,其他機器還可以繼續(xù)提供服務,保證服務不間斷袒餐。
在這個過程中飞蛹,我們遇到了session問題,然后我此昂到用session復制來解決這個問題灸眼;
在apache的配置文件中增加session粘帶特性:
????????????????worker.lb.sticky_session=1
????????????????worker.lb.sticky_session_force=0
Tomcat的配置
修改server.xml文件:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">增加jvmRoute=”tomcat2” ?*. ?jvmRoute賦的值為worker.properties中配置的相應的server名一致
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 將此配置的注釋去掉修改應用的web.xml文件在應用中的web.xml文件中增加桩皿。
如果這樣做,當?shù)谝淮卧L問的時候幢炸,會把所以數(shù)據(jù)全部緩存到第一臺服務器上泄隔,通過web配置文件,會把第一臺緩存的數(shù)據(jù)全部復制到第二胎服務器上宛徊,這樣做就加大網(wǎng)路通信量佛嬉,導致阻塞,所以我們就想到了可以通過memcached分布式緩存來存取session從而解決上述問題闸天。
如果你依然覺得有些茫然暖呕,不如加入我的Java架構(gòu)師之路:766529531?跟有多年Java開發(fā)經(jīng)驗的資深工程師聊一聊。也可獲取免費的視頻學習資料以及電子書學習資料喔苞氮!
Ant業(yè)務場景
Ant是基于java語言編寫的湾揽,因此具有跨平臺的特性,此外還具有簡潔方便笼吟,靈活配置的特性库物,因此我就在XX項目中使用ant進行項目的編譯,打包贷帮,部署操作戚揭。使用ant之后,如果我們在客戶那里修改代碼后撵枢,就可以直接使用ant進行編譯民晒,打包精居,部署,而不需要為了編譯潜必,打包靴姿,部署專門在客戶那里安裝eclipse.此外使用ant也可以直接和svn進行交互,下載源碼的同時進行編譯磁滚,打包空猜,部署。
maven業(yè)務場景
前段時間在研究maven恨旱,知道m(xù)aven是一個項目管理工具辈毯,其核心特點就是通過maven可以進行包的依賴管理,保證jar包版本的一致性搜贤,以及可以使多個項目共享jar包谆沃,從而能夠在開發(fā)大型j2ee應用的時候,減小項目的大小仪芒,并且和ant比起來唁影,maven根據(jù)“約定優(yōu)于配置”的特性,可以對其項目的編譯打包部署進行了更為抽象的封裝掂名,使得自己不需要像ant那樣進行詳細配置文件的編寫据沈,直接使用系統(tǒng)預定好的mvn clean,compile,test,package等命令進行項目的操作。于是我就在XX項目中采用了maven,為了保證團隊中的成員能夠節(jié)省下載jar包所需要的時間饺蔑,于是我就采用nexus搭建了在局域網(wǎng)內(nèi)的maven私服锌介,然后通過配置settings.xml中建立mirror鏡像,將所有下載jar包的請求都轉(zhuǎn)發(fā)maven私服上猾警,之后通過在pom.xml即(project object model)中配置項目所依賴的jar包孔祸,從而達到在構(gòu)建項目的時候,先從本地倉庫中查找发皿,如果不存在從內(nèi)部私服查找崔慧,如果不存在最后再從外網(wǎng)central服務器查找的機制,達到了節(jié)省下載帶寬穴墅,提高開發(fā)效率惶室,以及jar包重用的目的。
ant業(yè)務場景
ant是基于java語言編寫的玄货,因此具有跨平臺的特性皇钞,此外還具有簡潔方便,靈活配置的特性誉结,因此我就在XX項目中使用ant進行項目的編譯鹅士,打包券躁,部署操作惩坑。使用ant之后掉盅,如果我們在客戶那里修改代碼后,就可以直接使用ant進行編譯以舒,打包趾痘,部署,而不需要為了編譯蔓钟,打包永票,部署專門在客戶那里安裝eclipse.此外使用ant也可以直接和svn進行交互,下載源碼的同時進行編譯滥沫,打包侣集,部署。
maven的常用命令
mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0
mvn clean package
maven的生命周期是獨立的兰绣,但是生命周期下的階段是相互關聯(lián)并且延續(xù)的世分。
maven的生命周期
clean(清理):clean;default(默認):compile,test,packageinstall;site(站點)
Servlet的概述:
Servlet是一個web容器,我們通常用的servlet是httpservlet缀辩,而httpservlet又是繼承于genericservlet臭埋,而genericservlet又實現(xiàn)了servlet接口
servlet的生命周期是 :先進行實例化,然后是初始化臀玄,然后是提高服務瓢阴,然后銷毀,最后不可用健无,在這五個生命周期荣恐,其中,初始化是調(diào)用的init方法累贤,這個方法只有一個募胃,而提高服務的時候調(diào)用的是service方法,而我們具體在我們所寫的這個方法中畦浓,因為我們繼承了httpservlet痹束,其實就是對應了doGet(),doPost(),這種方法讶请,然后據(jù)我了解祷嘶,servlet是單例的。非線程安全的夺溢,我們通常有一下幾種方案來解決:
第一種论巍,繼承SingleThreadModel但是這樣每次都會創(chuàng)建一個新的servlet實例,但這樣消耗服務器的內(nèi)存风响,降低了性能嘉汰,并且這個接口現(xiàn)在已經(jīng)過時了,不推薦使用状勤。
第二種:我們盡量避免使用全局變量鞋怀,就我個人而言双泪,我比較喜歡使用這種方法。
第三種密似,我們可以通過使用ThreadLocal焙矛, 內(nèi)部結(jié)構(gòu)是一個Map結(jié)構(gòu),用當前線程作為key,他會創(chuàng)建多個副本残腌。get,set方法
第四種村斟,我們當然還可以來加鎖,進行解決線程問題抛猫。
而且我還知道蟆盹,向我們這種常用的MVC框架,struts1闺金,spring這些MVC框架日缨,都是基于servlet發(fā)展而來的,就比如struts1 的核心總控制器是ActionServlet掖看,而springMVC的前端總控制器是dispatchServlet匣距,在項目我們曾經(jīng)用serlet來生成 圖片驗證碼的,防止用戶進行暴力破解
(別人問了哎壳,再回答)
servlet的配置文件 ?web.xml
<servlet>
????????????????<servlet-name>ImageCodeServlet</servlet-name> ???
????????????????<servlet-class>org.leopard.code.ImageCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
???? ????????<servlet-name>ImageCodeServlet</servlet-name>
???????????? <url-pattern>/d</url-pattern>
</servlet-mapping>
描述:
我在web.xml中毅待,我首先需要寫一個servlet標簽,servlet標簽中有兩個子標簽归榕,一個叫servlet-name尸红,這個name可以隨便起,但是要保證唯一性刹泄,除此之外外里,在這個servlet-name下有一個servlet-class,這個servlet-class對應的就是我后臺提高服務的servlet特石,除此之外還有一個servlet-mapping盅蝗,這個里邊首先有一個servl-name。姆蘸,這個servl-name首先要保證和上邊的servlet-name保持一致墩莫,除此之外還有一個url-pattern,這是一個虛擬路徑逞敷,是用來發(fā)送請求的url地址
bugfree的操作步驟
我們在使用bugfree的時候我們首先登陸的時候是以測試員的身份登陸的狂秦,也就是系統(tǒng)管理員用戶;測試員在登陸后首先應該給要測試的項目的相關負責人推捐,每人創(chuàng)建一個賬號(也就是在登陸后的頁面的后臺管理中創(chuàng)建用戶)裂问,用戶都新建完成之后就新建組,把要測試的項目的用戶添加到組中。最后就新建項目并且新建該項目的模塊堪簿。新建完項目之后就是開始測試程序痊乾,在程序中遇到bug以后就把錯誤截圖,在到bugfree中新建bug填寫相關的信息和要指派的人(出錯模塊的負責人)和把剛才的錯誤截圖作為附件一并傳送過去戴甩。
開發(fā)人員每天早上上班的第一件事就是用自己的用戶登錄bugfree符喝,然后輸入查詢條件看看前一天有沒有指派給自己的bug需要解決的如果有就進行解決闪彼。
開發(fā)人員把對應的bug解決之后就去bugfree上把bug對應的狀態(tài)改成已解決狀態(tài)甜孤,然后進行保存提交,這樣bug的狀態(tài)就變成已解決狀態(tài)畏腕。測試人員上線查看已解決狀態(tài)的bug并再次進行測試缴川,如果經(jīng)過測試bug的問題已解決,就可以把bug關閉描馅;如果經(jīng)過測試把夸,發(fā)現(xiàn)仍然存在bug,就把bug激活铭污;這樣等開發(fā)人員再次登錄的時候就可以再次看到這個未解決的bug恋日,再次進行解決,如此反復直到bug全部解決嘹狞,因為bugfree對bug的修改都有保留岂膳,所有我們可以看到bug的一步步的完善,直到最后把bug關閉磅网。
Bug的三種狀態(tài):未解決(Active)(測試人員)谈截、已解決(Resolved)(開發(fā)人員)、關閉(Closed)(測試人員)
Axis2 的配置
axis2服務端配置流程
1.引入相關的jar包并且在web.xml中配置axis2的核心控制器 axisServlet
2.在web-inf下建立相關的三層文件夾結(jié)構(gòu):
services-->自定義文件夾名-->META-INF-->servies.xml
3.在servies.xml中配置service的name以及對應的springBeanName
4.在瀏覽器中輸入webservice的服務端地址并加上?wsdl來進行測試涧偷,看是否發(fā)布成功
axis2客戶端配置流程
1.通過wsdl2java根據(jù)webservice服務端的url生成客戶端代碼
2.將代碼引入項目的文件夾中進行正常訪問
二十六簸喂、spring定時器
每隔固定的時間執(zhí)行
1.建立一個triggers觸發(fā)器集合
2.建立SimpleTriggerBean并且指定每次間隔的時間以及執(zhí)行的次數(shù)以及要執(zhí)行的目標
3.通過 targetObject以及targetMethod找到要執(zhí)行的具體類的具體方法,目標對象是一個普通的java類
每到指定的時間執(zhí)行
1.建立一個triggers觸發(fā)器集合.
2.建立CronTriggerBean指定cron表達式以及要執(zhí)行的目標
3.通過 targetObject以及targetMethod找到要執(zhí)行的具體類的具體方法燎潮,目標對象是一個普通的java類
Ext概述
據(jù)我了解Ext是一個用js編寫RIA框架喻鳄,它可以和各種后臺語言結(jié)合使用。我在項目中用Ext來完成的模塊大概情況是這個樣子确封,首先我通過layout等于border的這種方式來進行布局诽表,分為上下左右中,然后在左邊用exttree來進行菜單的展示隅肥,之后在中間區(qū)域通過tabs來加入選項卡竿奏,而在選項卡中就是一個個的grid以及form,其中我在做grid的時候腥放,首先通過store來存取后臺返回的符合model格式數(shù)據(jù)集泛啸,store是通過proxy和后臺的contoller進行交互,之后把store賦值給grid的store屬性并且通過renderTO在指定的位置進行渲染展示秃症。
Grid問題:
當時我在做grid的時候候址,發(fā)現(xiàn)數(shù)據(jù)沒有展示出來吕粹,我通過f12進行跟蹤,發(fā)現(xiàn)壓根就沒有發(fā)送請求岗仑,后來我分析了下匹耕,發(fā)現(xiàn)因為沒有調(diào)用store的loadPage方法,所以導致了這個問題荠雕。除此之外在我們做項目的過程中稳其,我手底下帶的一個人同樣在負責grid的時候,數(shù)據(jù)可以正常展示炸卑,但分頁信息沒有展示既鞠,通過跟蹤他的代碼發(fā)現(xiàn)是因為他沒有把store屬性賦值給分頁工具條,所以才導致了這個問題盖文。
tabs選項卡:
當我在做tab選項卡這一模塊的時候嘱蛋,我首先在加載頁面的時候用TabPanel創(chuàng)建了一個tab頁面,讓它展示在中間位置五续,然后點擊左邊Tree菜單調(diào)用add方法動態(tài)添加一個個的tab選項卡洒敏,但是做的過程中出現(xiàn)了相同的選項卡會重復添加的問題,我查了一些相關資料疙驾,最后通過tab的id或者一個唯一標識判斷tab是否選中凶伙,如果選中則調(diào)用setActiveTab來激活該選項卡,讓它選中荆萤,否則就添加一個tab镊靴。最后達到了tab不存在就添加,存在就選中的效果链韭。
了解:
Ext4.0也支持前端的MVC開發(fā)模式:
為啥沒采用mvc的開發(fā)模式偏竟?
我們當時因為時間方面的原因,項目經(jīng)理就決定用普通的這種開發(fā)模式進行開發(fā)敞峭,并沒有采用Ext4.0這種mvc模式的特性踊谋。但我認為他們的核心操作流程是一致的所以對我來說去學習和使用這種方式并沒有什么難度。
lucene的概述
??lucene是一個全文檢索引擎旋讹,在進行模糊匹配的時候殖蚕,他可以用來替代數(shù)據(jù)庫中的like,從而在匹配準確性以及性能進行大幅度的提高。我在做XX項目的XX模塊的時候沉迹,就是用lucene來進行全文檢索用IK分詞器來進行分詞睦疫。從而實現(xiàn)了高亮顯示關鍵詞,分頁鞭呕,排序蛤育,多字段,多條件的高性能搜索。在從數(shù)據(jù)中取數(shù)據(jù)生成索引的時候瓦糕,因為表中的數(shù)據(jù)量比較大底洗,防止一次取出所導致內(nèi)存溢出問題,我采用了分段批量提取的方式進行咕娄,除此之外我們對后續(xù)增加的數(shù)據(jù)根據(jù)優(yōu)先級的不同采取不同的策略亥揖,對于那些需要及時顯示的數(shù)據(jù)我們通過spring定時器在短時間內(nèi)(30分鐘)進行增量索引的生成,對于那些不需要及時展示的數(shù)據(jù),我們通過spring定時器在每天晚上凌晨的時候進行索引的重新生成圣勒。
線程池作用
1.減少了創(chuàng)建和銷毀線程的次數(shù)费变,每個線程都可以被重復利用,可執(zhí)行多個任務灾而。
2.可以根據(jù)系統(tǒng)的承受能力胡控,調(diào)整線程池中線程的數(shù)目扳剿,防止因為消耗過多的內(nèi)存旁趟,而導致服務器宕機(每個線程需要大約1MB內(nèi)存,線程開的越多庇绽,消耗的內(nèi)存也就越大锡搜,最后宕機)。通常我們使用的線程池是實現(xiàn)了ExecutorService的ThreadPoolExecutor瞧掺。
jbpm是如何和spring進行整合
1.通過在spring-common.xml配置文件中配置springHelper耕餐,通過springHelper創(chuàng)建processEngine,再通過processEngine獲取各種工作流的Service辟狈,如repositoryService肠缔,executionService,historyService哼转,taskService
2.在src根目錄下新建jbpm.cfg.xml文件
Tomcat優(yōu)化
增大內(nèi)存(堆明未,持久代)并開啟server模式
我在做XXX項目時,用到了poi導入和導出數(shù)據(jù),由于公司的業(yè)務比較繁多,數(shù)據(jù)量很大,測試時報內(nèi)存溢出,經(jīng)過我的分析再結(jié)合上網(wǎng)查閱資料,發(fā)現(xiàn)可能是tomcat內(nèi)存不足,需要增大,修改配置文件后測試不再報錯.
tomcat增大內(nèi)存的方式通過修改tomcat配置文件
window下, 在bin/catalina.bat文件中最前面添加:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m –Xms1024m -Xmx1024m
linux下壹蔓,在catalina.sh最前面增加:
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m –Xms1024m -Xmx1024m "
-client –service
當我們在cmd中運行-java時,黑窗口會出現(xiàn)-client -service這兩參數(shù).其作用是設置虛擬機運行模式;client模式啟動比較快趟妥,但運行時性能和內(nèi)存管理效率不如server模式,通常用于客戶端應用程序佣蓉。server模式啟動比client慢披摄,但可獲得更高的運行性能。Windows默認為client勇凭,如果要使用server模式疚膊,就需要在啟動虛擬機時加-server參數(shù),以獲得更高性能虾标,對服務器端應用寓盗,推薦采用server模式,尤其是多個CPU的系統(tǒng)。在Linux贞让,Solaris上,默認值為server模式.
JDK版本
影響虛擬機還有JDK的版本,JDK分為32位,64位兩種版本,32位裝在32位系統(tǒng),64位系統(tǒng)可以裝32位和64位JDK.64位JDK性能優(yōu)于32位JDK.
測試的命令java -xmx數(shù)值m –version報錯配置大小失敗,反之成功
增加Tomcat最大連接數(shù)
使用場景
我在做完一個XXX項目后,測試時發(fā)現(xiàn)并發(fā)數(shù)量增加到一定程度就會很卡,于是我想到了是不是tomcat最大連接數(shù)設置有限制.果不其然,配置文件中最大值才500,于是我更改了最大連接數(shù),根據(jù)業(yè)務我修改了連接數(shù)為2000,完美的解決了這個問題;
修改方法在conf/service.xml中默認值
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="1500"
minSpareThreads="30" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000"
disableUploadTimeout="true" />,修改maxthreads的值即可
tomcat進行gzip壓縮從而降低網(wǎng)絡傳輸量
tomcat壓縮設置tomcat壓縮gzip啟用
HTTP壓縮可以大大提高瀏覽網(wǎng)站的速度周崭,它的原理是,在客戶端請求服務器對應資源后喳张,從服務器端將資源文件壓縮续镇,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮并瀏覽销部。相對于普通的瀏覽過程HTML ,CSS,Javascript , Text摸航,它可以節(jié)省60%左右的流量。更為重要的是舅桩,它可以對動態(tài)生成的酱虎,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進行壓縮擂涛,壓縮效率也很高读串。
啟用tomcat 的gzip壓縮
要使用gzip壓縮功能,你需要在Connector節(jié)點中加上如下屬性
compression="on"打開壓縮功能
compressionMinSize="50"啟用壓縮的輸出內(nèi)容大小撒妈,默認為2KB
noCompressionUserAgents="gozilla, traviata"對于以下的瀏覽器恢暖,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮
<Connector port="80" protocol="HTTP/1.1" ??
???????????connectionTimeout="20000" ??
???????????redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8" ??
???????????compression="on" ??
???????????compressionMinSize="50" noCompressionUserAgents="gozilla, traviata" ??
??????????compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
如果你依然覺得有些茫然,不如加入我的Java架構(gòu)師之路:766529531?跟有多年Java開發(fā)經(jīng)驗的資深工程師聊一聊狰右。也可獲取免費的視頻學習資料以及電子書學習資料喔杰捂!
memcached的介紹
memcached是一個用C語言開發(fā)的分布式的緩存,內(nèi)部基于類似hashMap的結(jié)構(gòu)棋蚌。它的優(yōu)點是協(xié)議簡單嫁佳,內(nèi)置內(nèi)存存儲,并且他的分布式算法是在客戶端完成的谷暮,不需要服務器端進行通信蒿往,我們當時在做項目的時候因為考慮到項目的高可用性高擴展性,因此在服務器部署方面采用了apache+jk+tomcat這種負載均衡的方式坷备,但是也帶來了一個問題就是session共享的問題熄浓,雖然可以通過session復制來解決這個問題,但是在性能方面存在缺陷省撑,所以最后我們采用了用memcached來存儲session赌蔑,這樣既解決了session共享問題,也解決了session復制那種方式所產(chǎn)生的性能問題竟秫。
了解(不必主動說娃惯,但別人問的話一定要知道)
memcached是以KEY-VALUE的方式進行數(shù)據(jù)存儲的,KEY的大小限制:Key(max)<=250個字符肥败;
VALUE在存儲時有限制:Value(max)<= 1M趾浅;
根據(jù)最近最少使用原則刪除對象即LRU.
memcached默認過期時間:ExpiresTime(max)= 30(days)