Java個人技術知識點總結(業務場景篇)

Java知音發表於2018-11-09

業務場景篇

Spring的概述

     Spring是完全面向介面的設計,降低程式耦合性,主要是事務控制並建立bean例項物件。在ssh整合時,充當黏合劑的作用。IOC(Inversion of Control) 控制反轉/依賴注入,又稱DI(Dependency Injection) (依賴注入)  

IOC的作用:產生物件例項,所以它是基於工廠設計模式的

Spring IOC的注入

   透過屬性進行注入,透過建構函式進行注入,

   注入物件陣列注入List集合   

   注入Map集合      注入Properties型別

Spring IOC自動繫結模式:

        可以設定autowire按以下方式進行繫結

        按byType只要型別一致會自動尋找,            

        按byName自動按屬性名稱進行自動查詢匹配.

AOP面向方面(切面)程式設計

AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面(切面)程式設計。

注:OOP(Object-Oriented Programming )物件導向程式設計

AOP主要應用於日誌記錄,效能統計,安全控制,事務處理(專案中使用的)等方面。

Spring中實現AOP技術:

在Spring中可以透過代理模式來實現AOP

代理模式分為

靜態代理:一個介面,分別有一個真實實現和一個代理實現。

動態代理:透過代理類的代理,介面和實現類之間可以不直接發生聯絡,而可以在執行期(Runtime)實現動態關聯。

動態代理有兩種實現方式,可以透過jdk的動態代理實現也可以透過cglib來實現而AOP預設是透過jdk的動態代理來實現的。jdk的動態代理必須要有介面的支援,而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實現ioc控制反轉描述:

原來需要我們自己進行bean的建立以及注入,而現在交給spring容器去完成bean的建立以及注入。

所謂的“控制反轉”就是 物件控制權的轉移,從程式程式碼本身轉移到了外部容器。

官方解釋:

控制反轉即IoC (Inversion of Control),它把傳統上由程式程式碼直接操控的物件的呼叫權交給容器,透過容器來實現物件元件的裝配和管理。所謂的“控制反轉”概念就是對元件物件控制權的轉移,從程式程式碼本身轉移到了外部容器。

事務概述

    在資料庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。

事務的ACID屬性

1.原子性(Atomicity)

原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

2.一致性(Consistency)

事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。(資料不被破壞)

3.隔離性(Isolation)

事務的隔離性是指一個事務的執行不能被其他事務干擾.

4.永續性(Durability)

永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的.即使系統重啟資料也不會丟失;在JDBC中,事務預設是自動提交的,每次執行一個SQL語句時,如果執行成功,就會向資料庫自動提交,而不能回滾

為了讓多個SQL語句作為一個事務執行:

(1)執行語句前呼叫 Connection 物件的 setAutoCommit(false);

以取消自動提交事務

(2)在所有的 SQL 語句都成功執行後,呼叫 commit(); 方法提交事務

(3)在出現異常時,呼叫 rollback(); 方法回滾事務。


許可權概述

          許可權涉及到5張表:

使用者表,角色表,許可權表(選單表),使用者角色關聯表,角色許可權關聯表

當使用者登入時,根據使用者名稱和密碼到使用者表驗證資訊是否合法,如果合法則獲取使用者資訊,之後根據使用者id再到使用者角色關聯表中得到相關連的角色id集合,之後根據角色id再到角色許可權關聯表中獲取該角色所擁有的許可權id集合,然後再根據許可權id集合到許可權表(選單表)中獲取具體的選單,展現給當前登入使用者,從而達到不同用使用者看到不同的選單許可權。

我們透過ZTree來給角色賦權並且透過ZTree來展示選單,以及透過ZTree來管 理選單即增加和編輯選單。

我們做的許可權控制到url級別,為了防止使用者不登入直接輸入url訪問的這個弊端,透過攔截器進行攔截驗證。


OSCache業務場景

      在我以前的專案中,我們考慮了系統效能問題,這個時候我們採用了Oscache快取,剛開始把這個功能交給了專案組中的另外一個同事來做的,但是他做完的時候他發現快取中明明已經快取了資料,但是在取得時候發現沒有資料,我們專案經理讓我去幫忙看看這個問題,我閱讀完他的程式碼之後,我發現了他每次快取的時候都是呼叫一個新的快取物件的方法,結果出現了明明已經走了快取的方法而取不到資料的問題,透過我多年的工作經驗,我就想到了應該用單例模式去封裝一個單例工具類來呼叫oscache。但是,在後來的測試過程中,發現當併發訪問的時候也會出現上述的問題,這個時候我直接採取的DCL(雙重判定鎖)單例模式封裝了工具類,既解決了執行緒安全問題,相對的效能問題也考慮到了,這個問題才得到了完善的解決。


執行緒概述

    執行緒的狀態以及狀態之間的相互轉換:

    1、新建狀態(New):新建立了一個執行緒物件。

  2、就緒狀態(Runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取CPU的使用權。

  3、執行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式程式碼。

  4、阻塞狀態(Blocked):阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

  (一)、等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池中。

  (二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入鎖池中。

  (三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

  5、死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

實現執行緒的兩種方式:

是繼承Thread類或實現Runnable介面,但不管怎樣,當new了這個物件後,執行緒就已經進入了初始狀態

wait和sleep的區別:

執行緒訪問:

鎖池狀態,之後等待鎖釋放,然後訪問程式碼

wait

等待佇列(釋放資源)--->呼叫notify或者notifyall之後鎖池狀態--->( 等待鎖釋放)--->可執行狀態--->執行狀態---->訪問程式碼

sleep,join

不釋放資源-->結束後直接進入可執行狀態--->執行狀態---->訪問程式碼

一個java控制檯程式,預設執行兩個執行緒,一個主執行緒,一個垃圾回收執行緒。

執行緒與程式的區別:

1.執行緒(Thread)與程式(Process)

程式定義的是應用程式與應用程式之間的邊界,通常來說一個程式就代表一個與之對應     的應用程式。不同的程式之間不能共享程式碼和資料空間,而同一程式的不同執行緒可以共     享程式碼和資料空間。

2.一個程式可以包括若干個執行緒,同時建立多個執行緒來完成某項任務,便是多執行緒。

Ajax請求Session超時問題

     我在做專案時有時會遇到session超時問題,如果session超時,平常請求沒有什麼問題,透過攔截器可以正確跳到登陸頁面,可是你如果用ajax請求的話這就出現問題了,因為ajax是非同步的,區域性重新整理,所以登陸介面不會再全頁面中顯示,他只會顯示到頁面的一部分當中。所以根據我這幾年的經驗找到了我認為比較好的一種方法。因為那我用的框架是和struts2整合的,所以就在攔截器中進行設定:

首先判斷session是否為空就是判斷session是否超時,如果超時就取出請求的head頭資訊request.getHeader("x-requested-with"),如果不為空就和XMLHttpRequest(Ajax標識)進行比較 (request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest"))) 如果相等說明此請求是ajax請求。

如果是ajax請求就可以用response.setHeader("鍵","值")來設定一個標識來告訴使用者這是ajax請求並且session超時時發出的,這樣我就可以在回撥函式中取出自己設定的那個唯一標識:XMLHttpRequest.getResponseHeader("");如果取出的值是和自己在後臺中設定的值一樣的話,就證明session已經超時,這樣就可以設定window.location.replace("登陸介面"),來跳轉到登陸介面了。

這樣做雖然解決了問題,但是,會在每個回撥函式中寫入那些程式碼,這樣的話程式碼就會顯得特別零散,所以就想能不能定義一個全域性的設定所以就找到了jqery的ajaxSetUp方法,透過ajaxSetUp對jqery的ajax進行全域性的判斷(ajaxSetUp就相當於ajax的攔截器),透過設定ajaxSetUp裡的complete,它就相當於回撥函式,這樣那就彌補了上一方法的不足。

我做專案時還用到$(document).ajaxStart(),這是ajax請求時的事件;$(document).ajaxSuccess(),這是AJAX請求成功後的事件。我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓使用者重複提交,更提高了使用者體驗度,讓使用者知道已經提交了。

java執行緒池概述

java 執行緒池的工作原理和資料庫連線池的差不多,因為每次重新建立執行緒都是很耗資源的操作,所以我們可以建立一個執行緒池,這樣當需要用到執行緒進行某些操作時,就可以直接去執行緒池裡面找到空閒的執行緒,這樣就可以直接使用,而不用等到用到的時候再去建立,用完之後可以把該執行緒重新放入執行緒池供其他請求使用從而提高應用程式的效能。

執行緒池的核心流程:

1.構建一個 ThreadPoolExecutor 並指定預設要建立的執行緒的數量

2.透過 threadPool.execute()

去新增一個個要執行的執行緒即實現了Runable介面的java類

3.在實現了Runable介面的java類的run方法中寫入具體的業務程式碼

執行緒池的業務場景

我在工作的時候,當時一個同事給我提了一個需求,目前有大量的圖片需要處理生產縮圖並進行加水印,因為按照普通的處理方法一個個的進行處理太慢了,問我有沒有好的解決方案,這個時候我就想到了java中的執行緒池,我構建了一個執行緒數為5個執行緒池,然後採用分段批次提取的方式每500條為一組資料進行圖片資訊的提取,然後再把這些透過Threadpool的execute方法交給執行緒池中的執行緒進行處理,即充分使用CPU硬體資源又加快了大資料情況下程式的處理效率。

我當時在工作的過程中,認識一個做電商的朋友,他們當時公司才起步,很多技術都不成熟,所以就常常和我探討一些技術問題,有次他向我請教一個問題,問我如何才能提高網站的效能,我根據自己在專案中的經驗以及自己以前閱讀的關於最佳化方面的資料給他提出了很多建議,如用lucene進行全文檢索,用memcached進行分散式快取,以及透過spring定時器結合freeMarker模板引擎來生成靜態頁面,由於要生成的頁面的數量比較多,考慮到程式的效能,我建議他結合java的執行緒池進行工作,這樣就可以充分使用了CPU硬體資源又加快了大資料情況下程式的處理效率。

如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!

OSCache概述

oscache是一個高效能的j2ee框架,可以和任何java程式碼進行整合,並且還可以透過標籤對頁面內容進行快取,還以快取請求。我們通常將那些頻繁訪問但是又不是經常改變的資料進行快取。為了保證快取資料的有效性,在資料發生改變的時候,我們要重新整理快取,避免髒資料的出現。重新整理快取的策略有兩種,一種是定時重新整理,一種手動重新整理。快取資料的時機通常也分為兩種,即在tomcat(web容器)啟動時候載入資料進行快取,另外也可以在使用者第一次訪問資料的時候進行快取,這個相當於快取的立即載入和按需載入。

快取的層次如下:jsp-->action-->service-->dao,快取越靠前對效能的提升越大,一個action裡面可以有多個service,一個service中可以有多個dao或者多個service,任何類之間都可以進行相互呼叫,可以透過建構函式傳參,set,get傳參或者是方法傳   參將相關的類連線起來。

OSCache+autocomplete+單例業務場景

      在我以前做某專案的過程中,其中我們在做產品列表的查詢的時候為了提高使用者的體驗度,我們使用了autocomplete外掛來代替select進行品牌的選擇,才開始的時候每次都要根據使用者輸入的資訊去查詢資料庫進行模糊匹配返回結果,後來我們考慮到系統的效能,因此我們採用了oscache快取,才開始這個功能是交給我們專案組中的另外一個同事來做的,但是他做完後,我們在使用這個工具類的時候,發現有時快取中明明已經有時我們需要的資料,但是從快取裡面取的時候,發現沒有,之後專案經理讓我去幫這個同事看看這個問題,我經過閱讀他的程式碼發現,它裡面在使用快取的時候,針對於每次方法的呼叫都產生一個新的例項,結果導致了上面的問題,這個時候我想起了可以使用設計模式中的單例模式來解決這個問題,才開始我直接採用了普通的單列模式,但是後來在測試的過程中,發現當使用者併發量大的時候還是會出現上面的問題,之後我再次考慮了程式碼,最後發現是因為沒有給單列模式加鎖的原因,從而導致了大使用者併發的時候,執行緒安全的問題,之後我便在方法上加上了synchronized關鍵字,解決上述的問題,但是後來測試人員反饋,覺的這段的效能有問題,我考慮之後便採用在方法體內加鎖並結合雙重判定的方式解決了上面的問題。我們是將資料在tomcat啟動的時候載入到快取中,之後使用者進行查詢的時候直接從快取中獲取資料,根據字首匹配進行查詢,將結果返回給使用者。這樣在提高使用者體驗度的同時也提高效能。


快取概述

應用程式為了提高效能,可以透過使用快取來達到目的,快取的儲存介質可以記憶體或者硬碟,通常將資料儲存在記憶體裡,確切的說是jvm的記憶體中,快取是基於Map這種思想構建的,以鍵值對的方式進行存取,之所以還可以將快取的資料儲存在硬碟中,是因為記憶體資源相當有限和寶貴,所以當記憶體資源不足的時候,就可以將其儲存到硬碟中,雖然硬碟的存取速度比記憶體要慢,但是因為減少了網路通訊量,所以還是提高程式的效能。快取可以分為客戶端快取和伺服器端快取,所謂的客戶端快取通常指的是IE瀏覽器的快取,伺服器端快取指的web伺服器的快取,通常可以透過第三方元件實現,如oscache,memcache

我們通常將那些頻繁訪問但是又不是經常改變的資料進行快取。為了保證快取資料的有效性,在資料發生改變的時候,我們要重新整理快取,避免髒資料的出現。重新整理快取的策略有兩種,一種是定時重新整理,一種手動重新整理。

快取的層次如下:jsp-->action-->service(通常放置在service)-->dao,快取越靠前對效能的提升越大

快取的策略:(快取空間不足需要進行清理的時候使用)

LRU:最近最少使用原則.(理解:儲存書)

FIFO:先進先出的快取策略.(理解:排隊)

你來說說快取?說說你對快取的理解(如果遇到重複的,就可以省略)

我們在專案中使用快取的目的是為了提高應用程式的效能,減少訪問資料庫的次數,從而提高應用程式的吞吐量。我們通常將許可權,選單,組織機構這些頻繁訪問但是不經常改變的基礎資料進行快取,其中我在做()某某專案的時候就透過oscache對ZTree的樹形選單進行了快取,並且在做的時候和單列設計模式進行結合,考慮到多執行緒下的安全問題,還對單例模式加入了雙重判定鎖的檢查方式。

實現頁面靜態化業務場景

我們在做某專案時,涉及到程式訪問的效能問題,這時候我們想到可以透過靜態化來提高使用者訪問時候的效能,所以我們就採用了freemarker模板引擎,考慮到頁面也是要有動態的變化的,所以我們採用spring定時器在每天晚上2點鐘的時候定時再次生成html靜態頁面,考慮釋出時候的效能問題,我們又採取執行緒池技術,讓多個執行緒同時釋出,從而縮減釋出時間。

servlet執行緒安全描述

servlet是單列的,對於所有請求都使用一個例項,所以如果有全域性變數被多執行緒使用的時候,就會出現執行緒安全問題。

解決這個問題有三種方案:

1.實現singleThreadModel介面,這樣對於每次請求都會建立一個新的servlet例項,這樣就會消耗服務端記憶體,降低效能,但是這個介面已經過時,不推薦使用。

2.可以透過加鎖(synchroniezd關鍵字)來避免執行緒安全問題。這個時候雖然還是單列,但是對於多執行緒的訪問,每次只能有一個請求進行方法體內執行,只有執行完畢後,其他執行緒才允許訪問,降低吞吐量。

3.避免使用全域性變數,使用區域性變數可以避免執行緒安全問題,強烈推薦使用此方法來解決servlet執行緒安全的問題。

(jbpm4)工作流引擎描述:

JPBM是JBOSS旗下的一個開源的基於hibernate的工作流引擎。工作流就是在日常生活中,我們一些常見的如請假流程、採購流程、入職流程,通俗的來講就是一些在現實生活中的流程以資訊化以程式的方式實現。

一個工作流首先需要進行流程定義,流程定義是由節點和跳轉組成的,節點又可以稱為環節、活動節點、活動環節,並且節點也可以分為兩大型別:人工節點和自動節點,人工節點有start開始節點、end結束節點、task任務節點,自動節點有decision判斷節點、fork分支節點、join聚合節點和state狀態節點,並且一個流程有且只有一個開始節點,但可以有多個結束節點。

流程定義是靜止的,它在執行狀態時會轉換成流程例項,一個流程定義可以對應多個流程例項。流程執行後,會產生兩個檔案,*.jdpl.xml檔案和*.png圖片檔案,也會生成18張資料庫表,常用且核心的表有JBPM4_LOB 儲存表,主要儲存xml檔案和png圖片、JBPM4_TASK 任務表、JBPM4_EXECUTION 流程例項表、JBPM4_VARIABLE變數表。

圖形化的靈活定製(主動說)

可以根據需求進行流程圖的改變的,即定義的流程圖是可以根據需要改變的,而不是死的。

可以進行圖形化的監控(主動說)

輸出圖片

獲取活動節點的座標

進行疊加

判斷節點:(主動說,也可以瞭解)

實現implements DecisionHandler介面並重寫decide方法,

返回的字串要和xml中配置的transition的name保持一致。

分支判定節點

JBPM有五大核心類:

        ProcessEngine:主要獲取各種的Service

        RepositoryService:主要釋出流程定義

        ExecutionService:主要操作流程例項

        TaskService:主要操作人工服務

        HistoryService:主要操作歷史服務。

核心方法:

讀取jbpm定義的檔案生成zip包存到lob表中:createDeployment()

獲取流程定義列表:createProcessDefinitionQuery

根據定義的key或id來啟動流程例項:startProcessInstanceByKey(id)

獲取待辦任務列表:findPersonalTasks(userName)

完成指定任務列表:completeTask(*.getActivityId())

獲取歷史任務列表:createHistoryTaskQuery()

獲取流程例項的ID:task.getExecutionId()

(瞭解的表)

JBPM4_HIST_ACTINST流程活動(節點) 例項表

JBPM4_HIST_DETAIL流程歷史詳細表

JBPM4_HIST_PROCINST流程例項歷史表

JBPM4_HIST_TASK流程任務例項歷史表

JBPM4_HIST_VAR流程變數( 上下文) 歷史表


JPBM業務場景

首先進行請假的流程定義,我們流程的定義是(員工提交請假單---》經理審批---》總監審批---》總經理審批---》結束),透過repositoryService將其釋出部署到jbpm4_lob表中,

之後獲取流程定義列表,選中請假的流程定義,員工開始進行請假單的填寫,儲存並透過executionService開啟流程例項,然後用taskService獲取經理的待辦任務列表,選中待辦任務,進行審批,透過呼叫taskService.completeTask()進入到總監審批環節,然後用總監進行登入,同樣獲取待辦任務列表,然後呼叫taskService.completeTask()進入總經理審批環節,總經理審批之後,結束流程。在這個過程中我們還可以根據historyService檢視當前登入人已辦的任務列表。

Ant描述

Ant是apache旗下的對專案進行自動打包、編譯、部署的構建工具,他主要具有     輕量級並且跨平臺的特性,而且基於jvm,預設檔名為build.xml

Ant主要的標籤:

Project根標籤,target任務標籤,property屬性標籤,自定義鍵/值 供多次使用,java執行編譯後的java檔案,javac編譯java檔案,war打成war包,其它標籤:copy,delete,mkdir,move,echo等。

FreeMarker描述

       FreeMarker是一個用Java語言編寫的模板引擎,它是基於模板來生成文字輸出的通用工具。Freemarker可以生成HTML, XML,JSP或Java等多種文字輸出。

工作原理:定義模板檔案,嵌入資料來源,透過模板顯示準備的資料

(資料 + 模板 = 輸出)

我們在使用模板中發現freemarker具有許多優點,它徹底的分離表現層和業務邏輯,模板只負責資料在頁面中的表現,不涉及任何的邏輯程式碼,所以使得開發過程中的人員分工更加明確,作為介面開發人員,只需專心建立HTML檔案、影像以及Web頁面的其他視覺化方面,不用理會資料;而程式開發人員則專注於系統實現,負責為頁面準備要顯示的資料。

如果使用jsp來展示,開發階段進行功能調適時,需要頻繁的修改JSP,每次修改都要編譯和轉換,浪費了大量時間,FreeMarker模板技術不存在編譯和轉換的問題,在開發過程中,我們在不必在等待介面設計開發人員完成頁面原型後再來開發程式。由此使用freemarker還可以大大提高開發效率。

webService描述

(主動說)

webservice是SOA(面向服務程式設計)的一種實現,主要是用來實現異構平臺通訊也就是不同平臺不同專案之間的資料傳輸,從而避免了資訊孤島的問題,它之所以能夠進行異構平臺通訊是因為它是完全基於xml的,所以說,webService是跨平臺,跨語言,跨框架的,在java中通常有三種技術框架分別是xfire,cxf,axis2。

我們為了保證

webservice的安全性,採用了基於

WS-Security標準的安全驗證(使用回撥函式)。

(沒必要主動說)

webservice的三要素分別是:

      wsdl(webservice description language)用來描述釋出的介面(服務)

      soap(simple object access protocol)是xml和http的結合,是webservice資料通訊的協議

      uddi用來管理,查詢webService的服務

(沒必要主動說)

webservice的具體三種實現方式(框架)或者三種實現框架的區別

      1. Axis2:可以用多種語言開發,是一個重量級框架,功能非常強大,但是它的效能比較低。

      2. Xfire:它相比Axis2來說是一個輕量級框架,它的效能要比Axis2高。

      3. cxf:是Xfire的升級版,就好比是,struts2是webwork的升級,然後cxf和spring整合起來非常方便,簡易,效能方面也要比Xfire高。

【注】jdk6自帶的webservice  jws

(主動說)

業務場景

我在以前做專案的時候,其中遇到一個功能,需要進行兩個專案之間的資料的傳輸,專案經理讓我去完成這個任務,我根據以往的專案經驗,想到兩種解決方案,第一種就是開放另外一個專案的資料庫的許可權給我,然後我直接透過訪問另外一個專案的資料庫,來得到需要的資訊,但後來我分析了下,覺的這種方式不安全,而且因為當時這個專案是另外一家公司負責在做,所以資料庫裡面的表結構,

以及以後牽涉

到的責任問題都很多,所以我就採用了第二種方案,即透過webservices的方式,進行異構系統之間資料資訊的傳遞,webservices的具體實現,有xfire,cxf,axis2,我根據以往的專案經驗,瞭解到cxf是xfire的升級版本,適用於java語言,xfire/cxf效能比axis2要高,並且和spring整合起來也比較方便,而axis2支援更多的語言,效能相對於cxf要低,透過上面分析,結合我們目前的兩個專案都是基於java語言的,所以我採用cxf這種方式實現了兩個專案之間資料的傳遞,我們為了保證webservice的安全性我們採用了基於WS-Security標準的安全驗證(使用CXF回撥函式)。

(沒必要主動說)

webservice服務端配置流程

首先在web.xml中引入cxfServlet核心類,指定對以/cxf開頭的url路徑提供webservice服務,之後我們在要釋出成webservice介面上新增@Webservice 註解,而且還要在實現類上新增同樣的webservice註解並且要說明實現了哪個介面,之後在spring-webservice.xml中釋出webservice服務,透過jaxws:endpoint這個標籤,並且在標籤配置implementor和address來表明實現服務的類,以及釋出的地址,最後在瀏覽器中輸入相關的webservice地址?wsdl來驗證服務是否釋出成功。

(沒必要主動說)

webservice客戶端的配置

首先透過wsdl2java根據釋出的webservice服務端地址的wsdl生成客戶端呼叫的中間橋樑java類,將生成的java類複製到客戶端專案中,配置spring-client.xml檔案,透過jaxws:client定義一個bean,並透過address屬性指明要訪問的webservice的服務地址,透過serviceClass指明充當中間橋樑的服務類,之後獲取該bean,就可以透過它來訪問釋出的webservice介面中的方法。

oracle索引概述

  索引呢是與表相關的一個可選結構,可以提高sql語句的檢索效率,相當於我們的字典目錄 ,可以快速進行定位 ,所以可以減少磁碟I/O,   但是因為索引在物理與邏輯上都是獨立於表的資料  它會佔用一定的物理空間(額外磁碟空間)  所以並不是索引越多越好,而我們應該根據業務需求去建立索引,而且進行增刪改操作時 oracle又要自動維護索引  所以在一定程度上也降低了維護速度,而且我們在建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加,我們一般建立索引呢  是這樣建立的 create  index  索引名 on  表名(欄位),索引又分為普通索引 唯一索引(unique)  單個索引  複合索引(又叫組合索引,在索引建立語句中同時可包含多個欄位名),順序索引,雜湊索引,點陣圖索引。

oracle儲存過程

儲存過程就是封裝一些sql的集合,也就是一條條的sql語句,過程的優點就是簡化了sql命令加上它是預編譯的,所以它的執行效率和效能較高,再者,如果不呼叫過程的話就要和資料庫發生多次互動,呼叫過程只需傳一個命令所有的那些執行邏輯都在資料庫端執行,所以說它降低了網路的通訊量,其次,儲存過程大大提高了安全性,這就是優點

缺點呢,就是不同的資料庫對過程支援的關鍵字支援的關鍵字都是不一樣的,所以它的移植性是非常差的,再者,它的維護性難度也比較大,因為它沒有專業的除錯和維護工具,所以說它維護起來比較麻煩,這就是儲存過程的基本概述.

Junit業務場景

在我們開發專案的時候為了提高程式碼的效能和保證邏輯正確性,在我們編寫程式碼後往往都要進行單元測試,來驗證程式碼,當時我們公司開發人員全部使用的main方法來進行驗證,但是使用mian的最大缺點就是不能將多個類同時進行驗證,驗證的結果不直觀,測試複雜(每個類都要寫main方法,單個執行),一定程度上浪費時間,所有我和專案經理提議使用專業測試工具Junit來進行測試,因為Junit是一個Java語言的單元測試框架 ,測試簡單,不僅可以提供工作效率和程式碼的質量,也提高團隊的合作能力,我提議後我們進行了Junit的培訓使用Junit4加註解的方式來測試。

Apache+Tomcat實現負載均衡及seesion複製

當我們tomcat訪問量大,執行緒連線數不夠時,我們考慮到了tomcat的負載均衡來分擔過多的訪問.效能方面負載均衡也能利用多臺tomcat來增大記憶體量,

流程 ,準備工作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 指定分配權重值越大分擔請求越多,worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2  指定分擔請求的tomcat Session的複製在tomcat中service.xml中Engine標籤加入 jvmRoute  值為work,properties中指定的tomcat名稱,然後開啟<Cluster標籤的註釋,最後在應用中程式的web.xml檔案中增加<distributable/>。

我們在做這個專案時,我們考慮到伺服器效能的問題,我們最開始想到使用縱向擴充套件,來增加硬體的配置提高其效能,但這樣做比較耗費資金,而且伺服器記憶體空間也是有限的;所以後來就想到使用橫向擴充套件來達到這一目的

當時我們的apache是透過jk藉助於ajp協議與tomcat進行通訊的,在我們不進行負載均衡之前,那所有的請求都由一臺tomcat進行處理,這樣會使我們的tomcat所承受的壓力增大,而我們進行負載均衡之後,同樣數量的請求經過apache和jk將其分發到多臺tomcat進行處理,從而降低每臺tomcat所承受的壓力,而且當其中一臺機器當機時,其他機器還可以繼續提供服務,保證服務不間斷。

在這個過程中,我們遇到了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檔案中增加。

如果這樣做,當第一次訪問的時候,會把所以資料全部快取到第一臺伺服器上,透過web配置檔案,會把第一臺快取的資料全部複製到第二胎伺服器上,這樣做就加大網路通訊量,導致阻塞,所以我們就想到了可以透過memcached分散式快取來存取session從而解決上述問題。

如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!

Ant業務場景

Ant是基於java語言編寫的,因此具有跨平臺的特性,此外還具有簡潔方便,靈活配置的特性,因此我就在XX專案中使用ant進行專案的編譯,打包,部署操作。使用ant之後,如果我們在客戶那裡修改程式碼後,就可以直接使用ant進行編譯,打包,部署,而不需要為了編譯,打包,部署專門在客戶那裡安裝eclipse.此外使用ant也可以直接和svn進行互動,下載原始碼的同時進行編譯,打包,部署。

maven業務場景

前段時間在研究maven,知道maven是一個專案管理工具,其核心特點就是透過maven可以進行包的依賴管理,保證jar包版本的一致性,以及可以使多個專案共享jar包,從而能夠在開發大型j2ee應用的時候,減小專案的大小,並且和ant比起來,maven根據“約定優於配置”的特性,可以對其專案的編譯打包部署進行了更為抽象的封裝,使得自己不需要像ant那樣進行詳細配置檔案的編寫,直接使用系統預定好的mvn clean,compile,test,package等命令進行專案的操作。於是我就在XX專案中採用了maven,為了保證團隊中的成員能夠節省下載jar包所需要的時間,於是我就採用nexus搭建了在區域網內的maven私服,然後透過配置settings.xml中建立mirror映象,將所有下載jar包的請求都轉發maven私服上,之後透過在pom.xml即(project object model)中配置專案所依賴的jar包,從而達到在構建專案的時候,先從本地倉庫中查詢,如果不存在從內部私服查詢,如果不存在最後再從外網central伺服器查詢的機制,達到了節省下載頻寬,提高開發效率,以及jar包重用的目的。

ant業務場景

ant是基於java語言編寫的,因此具有跨平臺的特性,此外還具有簡潔方便,靈活配置的特性,因此我就在XX專案中使用ant進行專案的編譯,打包,部署操作。使用ant之後,如果我們在客戶那裡修改程式碼後,就可以直接使用ant進行編譯,打包,部署,而不需要為了編譯,打包,部署專門在客戶那裡安裝eclipse.此外使用ant也可以直接和svn進行互動,下載原始碼的同時進行編譯,打包,部署。

maven的常用命令

mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0

mvn clean package

maven的生命週期是獨立的,但是生命週期下的階段是相互關聯並且延續的。

maven的生命週期

clean(清理):clean;default(預設):compile,test,packageinstall;site(站點)

Servlet的概述:

Servlet是一個web容器,我們通常用的servlet是httpservlet,而httpservlet又是繼承於genericservlet,而genericservlet又實現了servlet介面

servlet的生命週期是 :先進行例項化,然後是初始化,然後是提高服務,然後銷燬,最後不可用,在這五個生命週期,其中,初始化是呼叫的init方法,這個方法只有一個,而提高服務的時候呼叫的是service方法,而我們具體在我們所寫的這個方法中,因為我們繼承了httpservlet,其實就是對應了doGet(),doPost(),這種方法,然後據我瞭解,servlet是單例的。非執行緒安全的,我們通常有一下幾種方案來解決:

第一種,繼承SingleThreadModel但是這樣每次都會建立一個新的servlet例項,但這樣消耗伺服器的記憶體,降低了效能,並且這個介面現在已經過時了,不推薦使用。

第二種:我們儘量避免使用全域性變數,就我個人而言,我比較喜歡使用這種方法。

第三種,我們可以透過使用ThreadLocal, 內部結構是一個Map結構,用當前執行緒作為key,他會建立多個副本。get,set方法

第四種,我們當然還可以來加鎖,進行解決執行緒問題。

而且我還知道,向我們這種常用的MVC框架,struts1,spring這些MVC框架,都是基於servlet發展而來的,就比如struts1 的核心總控制器是ActionServlet,而springMVC的前端總控制器是dispatchServlet,在專案我們曾經用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,這是一個虛擬路徑,是用來傳送請求的url地址

bugfree的操作步驟

我們在使用bugfree的時候我們首先登陸的時候是以測試員的身份登陸的,也就是系統管理員使用者;測試員在登陸後首先應該給要測試的專案的相關負責人,每人建立一個賬號(也就是在登陸後的頁面的後臺管理中建立使用者),使用者都新建完成之後就新建組,把要測試的專案的使用者新增到組中。最後就新建專案並且新建該專案的模組。新建完專案之後就是開始測試程式,在程式中遇到bug以後就把錯誤截圖,在到bugfree中新建bug填寫相關的資訊和要指派的人(出錯模組的負責人)和把剛才的錯誤截圖作為附件一併傳送過去。

開發人員每天早上上班的第一件事就是用自己的使用者登入bugfree,然後輸入查詢條件看看前一天有沒有指派給自己的bug需要解決的如果有就進行解決。

開發人員把對應的bug解決之後就去bugfree上把bug對應的狀態改成已解決狀態,然後進行儲存提交,這樣bug的狀態就變成已解決狀態。測試人員上線檢視已解決狀態的bug並再次進行測試,如果經過測試bug的問題已解決,就可以把bug關閉;如果經過測試,發現仍然存在bug,就把bug啟用;這樣等開發人員再次登入的時候就可以再次看到這個未解決的bug,再次進行解決,如此反覆直到bug全部解決,因為bugfree對bug的修改都有保留,所有我們可以看到bug的一步步的完善,直到最後把bug關閉。

Bug的三種狀態:未解決(Active)(測試人員)、已解決(Resolved)(開發人員)、關閉(Closed)(測試人員)

Axis2 的配置

axis2服務端配置流程

1.引入相關的jar包並且在web.xml中配置axis2的核心控制器 axisServlet

2.在web-inf下建立相關的三層資料夾結構:

services-->自定義資料夾名-->META-INF-->servies.xml

3.在servies.xml中配置service的name以及對應的springBeanName

4.在瀏覽器中輸入webservice的服務端地址並加上?wsdl來進行測試,看是否釋出成功

axis2客戶端配置流程

1.透過wsdl2java根據webservice服務端的url生成客戶端程式碼

2.將程式碼引入專案的資料夾中進行正常訪問

二十六、spring定時器

每隔固定的時間執行

1.建立一個triggers觸發器集合

2.建立SimpleTriggerBean並且指定每次間隔的時間以及執行的次數以及要執行的目標

3.透過 targetObject以及targetMethod找到要執行的具體類的具體方法,目標物件是一個普通的java類

每到指定的時間執行

1.建立一個triggers觸發器集合.

2.建立CronTriggerBean指定cron表示式以及要執行的目標

3.透過 targetObject以及targetMethod找到要執行的具體類的具體方法,目標物件是一個普通的java類

Ext概述

據我瞭解Ext是一個用js編寫RIA框架,它可以和各種後臺語言結合使用。我在專案中用Ext來完成的模組大概情況是這個樣子,首先我透過layout等於border的這種方式來進行佈局,分為上下左右中,然後在左邊用exttree來進行選單的展示,之後在中間區域透過tabs來加入選項卡,而在選項卡中就是一個個的grid以及form,其中我在做grid的時候,首先透過store來存取後臺返回的符合model格式資料集,store是透過proxy和後臺的contoller進行互動,之後把store賦值給grid的store屬性並且透過renderTO在指定的位置進行渲染展示。

Grid問題:

當時我在做grid的時候,發現資料沒有展示出來,我透過f12進行跟蹤,發現壓根就沒有傳送請求,後來我分析了下,發現因為沒有呼叫store的loadPage方法,所以導致了這個問題。除此之外在我們做專案的過程中,我手底下帶的一個人同樣在負責grid的時候,資料可以正常展示,但分頁資訊沒有展示,透過跟蹤他的程式碼發現是因為他沒有把store屬性賦值給分頁工具條,所以才導致了這個問題。

tabs選項卡:

當我在做tab選項卡這一模組的時候,我首先在載入頁面的時候用TabPanel建立了一個tab頁面,讓它展示在中間位置,然後點選左邊Tree選單呼叫add方法動態新增一個個的tab選項卡,但是做的過程中出現了相同的選項卡會重複新增的問題,我查了一些相關資料,最後透過tab的id或者一個唯一標識判斷tab是否選中,如果選中則呼叫setActiveTab來啟用該選項卡,讓它選中,否則就新增一個tab。最後達到了tab不存在就新增,存在就選中的效果。

瞭解:

Ext4.0也支援前端的MVC開發模式:

為啥沒采用mvc的開發模式?

我們當時因為時間方面的原因,專案經理就決定用普通的這種開發模式進行開發,並沒有採用Ext4.0這種mvc模式的特性。但我認為他們的核心操作流程是一致的所以對我來說去學習和使用這種方式並沒有什麼難度。

lucene的概述

  lucene是一個全文檢索引擎,在進行模糊匹配的時候,他可以用來替代資料庫中的like,從而在匹配準確性以及效能進行大幅度的提高。我在做XX專案的XX模組的時候,就是用lucene來進行全文檢索用IK分詞器來進行分詞。從而實現了高亮顯示關鍵詞,分頁,排序,多欄位,多條件的高效能搜尋。在從資料中取資料生成索引的時候,因為表中的資料量比較大,防止一次取出所導致記憶體溢位問題,我採用了分段批次提取的方式進行,除此之外我們對後續增加的資料根據優先順序的不同採取不同的策略,對於那些需要及時顯示的資料我們透過spring定時器在短時間內(30分鐘)進行增量索引的生成,對於那些不需要及時展示的資料,我們透過spring定時器在每天晚上凌晨的時候進行索引的重新生成。

執行緒池作用

1.減少了建立和銷燬執行緒的次數,每個執行緒都可以被重複利用,可執行多個任務。

2.可以根據系統的承受能力,調整執行緒池中執行緒的數目,防止因為消耗過多的記憶體,而導致伺服器當機(每個執行緒需要大約1MB記憶體,執行緒開的越多,消耗的記憶體也就越大,最後當機)。通常我們使用的執行緒池是實現了ExecutorService的ThreadPoolExecutor。

jbpm是如何和spring進行整合

1.透過在spring-common.xml配置檔案中配置springHelper,透過springHelper建立processEngine,再透過processEngine獲取各種工作流的Service,如repositoryService,executionService,historyService,taskService

2.在src根目錄下新建jbpm.cfg.xml檔案

Tomcat最佳化

增大記憶體(堆,持久代)並開啟server模式

我在做XXX專案時,用到了poi匯入和匯出資料,由於公司的業務比較繁多,資料量很大,測試時報記憶體溢位,經過我的分析再結合上網查閱資料,發現可能是tomcat記憶體不足,需要增大,修改配置檔案後測試不再報錯.

tomcat增大記憶體的方式透過修改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時,黑視窗會出現-client -service這兩引數.其作用是設定虛擬機器執行模式;client模式啟動比較快,但執行時效能和記憶體管理效率不如server模式,通常用於客戶端應用程式。server模式啟動比client慢,但可獲得更高的執行效能。Windows預設為client,如果要使用server模式,就需要在啟動虛擬機器時加-server引數,以獲得更高效能,對伺服器端應用,推薦採用server模式,尤其是多個CPU的系統。在Linux,Solaris上,預設值為server模式.

JDK版本

影響虛擬機器還有JDK的版本,JDK分為32位,64位兩種版本,32位裝在32位系統,64位系統可以裝32位和64位JDK.64位JDK效能優於32位JDK.

測試的命令java -xmx數值m –version報錯配置大小失敗,反之成功

增加 T omcat最大連線數

使用場景

我在做完一個XXX專案後,測試時發現併發數量增加到一定程度就會很卡,於是我想到了是不是tomcat最大連線數設定有限制.果不其然,配置檔案中最大值才500,於是我更改了最大連線數,根據業務我修改了連線數為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壓縮從而降低網路傳輸量

tomcat壓縮設定tomcat壓縮gzip啟用

HTTP壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求伺服器對應資源後,從伺服器端將資原始檔壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML ,CSS,Javascript , Text,它可以節省60%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。

啟用 tomcat  gzip 壓縮

要使用gzip壓縮功能,你需要在Connector節點中加上如下屬性

compression="on"開啟壓縮功能

compressionMinSize="50"啟用壓縮的輸出內容大小,預設為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架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!

memcached的介紹

memcached是一個用C語言開發的分散式的快取,內部基於類似hashMap的結構。它的優點是協議簡單,內建記憶體儲存,並且他的分散式演算法是在客戶端完成的,不需要伺服器端進行通訊,我們當時在做專案的時候因為考慮到專案的高可用性高擴充套件性,因此在伺服器部署方面採用了apache+jk+tomcat這種負載均衡的方式,但是也帶來了一個問題就是session共享的問題,雖然可以透過session複製來解決這個問題,但是在效能方面存在缺陷,所以最後我們採用了用memcached來儲存session,這樣既解決了session共享問題,也解決了session複製那種方式所產生的效能問題。

瞭解(不必主動說,但別人問的話一定要知道)

memcached是以KEY-VALUE的方式進行資料儲存的,KEY的大小限制:Key(max)<=250個字元;

VALUE在儲存時有限制:Value(max)<= 1M;

根據最近最少使用原則刪除物件即LRU.

memcached預設過期時間:ExpiresTime(max)= 30(days)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555151/viewspace-2219435/,如需轉載,請註明出處,否則將追究法律責任。

相關文章