JAVAEE面試題



XML部分


1XML技術的作用?

XML技術用於數據存儲、信息配置、數據交換三方面。

可以將數據存儲在XML中,通過節點、元素內容、屬性標示數據內容及關係。

可以使用XML很方便的做信息配置,軟件的各種配置參數和對象關係都存貯在XML文件中。

在做數據交換平臺時,將數據組裝成XML文件,然後將XML文件壓縮打包加密後通過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。

2XML文檔約束有哪幾種?有什麼區別?

XML DTD(功能有限)

XML Schema (功能強大)

Schema本身是XML的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的)Schema支持命名空間,Schema支持數據類型,並且支持自定義數據類型,功能更完善,更強大,提供了無限的可擴展性。而且SchemaW3C的標準。

3XML的解析方式有哪幾種?有什麼區別?

DOMSAX等。

DOM:(Document Object Model, 即文檔對象模型) 是 W3C 組織推薦的處理 XML 的一種標準方式。

DOM中的核心概念就是節點。DOM在分析XML文檔時,將組成XML文檔的各個部分(元素、屬性、文本、註釋和處理指令等)映射成一個對象,這個對象就叫做節點。在內存中,這些節點形成一顆文檔樹。整棵樹勢一個節點,樹中的每一個節點也是一顆樹(子樹),我們通過訪問樹中的節點來存取XML文檔的內容。由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。

DOM的優點是使用比較靈活,缺點是需要將整個文檔加載到內存,對內存消耗比較大。

 

SAX(simple api for xml)基於事件.

SAX基於事件驅動的工作方式,順序讀取XML文件,當遇到文件開頭,結束,

或標籤開頭和結束時,會觸發一個事件。在讀xml的過程會不斷拋出對象作爲事件參數拋出.在SAX中只能讀,不能寫,而且只讀一次,其優點是對內存消耗較小.

 

4XML常用解析API有哪幾種?

XML常用解析APIJAXPJDOMDom4j等。

JAXPJava API for XML Processing的英文字頭縮寫,中文含義是:用於XML文檔處理的使用Java語言編寫的編程接口。由於問題太多,從JDK1.7開始刪除該功能。不推薦使用。

 

JDOM是最早期很多人使用的一個第三方工具包,它提供了一些簡單的方法解析XMLJDOM裏面大部分是抽象類和類。

 

Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4jAPI相對要複雜一些,但它提供了比JDOM更好的靈活性。

Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件的XML解析都是採用的Dom4j,例如StrutsHibernateSpring

現階段最優雅最流行的解析XMLAPI就是Dom4j.

 

Html&JavaScript&Ajax部分

Html&JavaScript&Ajax部分的面試題,可能覆蓋HtmlJavaScriptAjax等相關內容,這些知識基本都可通過《瘋狂Ajax講義》一書找到詳細解答。

這部分面試題大部分從網絡收集、整理,也有部分題目來自瘋狂軟件學員面試之後的反饋。

 

1iHTML form 提交之前如何驗證數值文本框的內容全部爲數字

<input type="text" id="d1" onblur=" chkNumber (this)"/>

<script type=text/javascript />

function chkNumber(eleText) 

{

var value = eleText.value;

var len = value.length;

for(var i=0;i<len;i++)

{

if(value.charAt(i)>"9" || value.charAt(i)<"0")

{

alert("含有非數字字符"); 

eleText.focus();

break;

}

}

}

</script>

2Ajax是什麼?包含什麼技術?有什麼作用?

Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的縮寫

Ajax 嘗試建立桌面應用程序的功能和交互性,與不斷更新的 Web 應用程序之間的橋樑。不需要刷新頁面就可以將請求提交到後臺,用戶根本感覺不到頁面在發送請求或是交換數據.

Ajax 提供將笨拙的 Web 界面轉化成能迅速響應的 Ajax 應用程序。

下面是 Ajax 應用程序所用到的基本技術:

HTML 用於建立 Web 表單並確定應用程序其他部分使用的字段。

JavaScript 代碼是運行 Ajax 應用程序的核心代碼,幫助改進與服務器應用程序的通信。

DHTML 或 Dynamic HTML,用於動態更新表單。

我們將使用div、span和其他動態 HTML 元素來標記 HTML。

文檔對象模型 DOM 用於(通過 JavaScript 代碼)處理 HTML 結構和(某些情況下)服務器返回的 XMLXMLHttpRequest 對象XML

3Ajax的核心的對象是什麼?

Ajax的核心對象是XMLXMLHttpRequest 對象

XMLHttpRequest提供不重新加載頁面的情況下更新網頁,在頁面加載後在客戶端向服務器請求數據,在頁面加載後在服務器端接受數據,在後臺向客戶端發送數據。XMLHttpRequest 對象提供了對 HTTP 協議的完全的訪問,包括做出 POST GET 請求的能力。XMLHttpRequest 可以同步或異步返回 Web 服務器的響應,並且能以文本或者一個 DOM 文檔形式返回內容。儘管名爲 XMLHttpRequest,它並不限於和 XML 文檔一起使用:它可以接收任何形式的文本文檔。

4Ajax的亂碼解決問題?

Javascript是使用UTF-8國際編碼,即每個漢字用4個字節來存儲,這就造成了用AJAXsend數據的時候出現會亂碼。

Ajax亂碼產生主要有2個原因

1. XMLHttpRequest返回的數據默認的字符編碼是UTF-8,如果前臺頁面是gb2312或者其它編碼數據就會產生亂碼。

2. post方法提交數據默認的字符編碼是UTF-8,如果後臺是gb2312或其他編碼數據就會產生亂碼

 

解決方案:

前臺後臺都用UTF-8編碼

客戶端、服務器端全部採用UTF-8編碼,且url發送中文字採用escape編碼,unescape解碼。

而且效率高,而且符合目前的形式,UTF-8編碼本身就是一種比較優秀的編碼。

5Json有什麼作用?

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。

它基於JavaScriptStandard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

JSON建構有兩種結構:

1. 鍵值對: { "name": "Alice", "sex":"female", "age": "18" }

2. 數組:  

{ "people": [

  { "name": "Alice", "sex":"female", "age": "18" },

{ "name": "Scott", "sex":"male", "age": "35" }

]}

JSON JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON 數據不需要任何特殊的 API 或工具包。

使用JSON可以很方便的和後臺的Java對象進行數據傳遞,這也是AjaxJSON大量使用的一個原因。

6DWR是什麼?有什麼作用?

DWRDirect Web Remoting)是一個用於改善web頁面與Java類交互的遠程服務器端Ajax開源框架,可以幫助開發人員開發包含AJAX技術的網站。

它可以允許在瀏覽器裏的代碼使用運行在WEB服務器上的JAVA函數,就像它就在瀏覽器裏一樣。

7Jqury是什麼?有什麼作用?

Jquery是繼prototype之後又一個優秀的Javascrīpt框架。它是輕量級的js(壓縮後只有21k) ,它兼容CSS3,還兼容各種瀏覽器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用戶能更方便地處理HTML documentsevents、實現動畫效果,並且方便地爲網站提供AJAX交互。jQuery還有一個比較大的優勢是,它的文檔說明很全,而且各種應用也說得很詳細,同時還有許多成熟的插件可供選擇。

 

JavaWeb部分

JavaWeb部分的面試題,可能覆蓋ServletJSPEL表達式、JSTM標籤庫等相關內容,這些知識基本都可通過《輕量級JavaEE企業應用實戰(第三版)整合開發》一書找到詳細解答。這部分面試題大部分從網絡收集、整理,也有部分題目來自瘋狂軟件學員面試之後的反饋。

 

1Http請求的GetPost的區別?

1. get從地址欄以明文的方式提交請求信息內容?username=admin&password=123,用戶可見, 而post從請求正文提交請求信息內容,用戶不可見。

   2. get提交因爲是從地址欄傳遞,而瀏覽器的地址欄長度有限制,不能提交大數據

         post從請求正文傳遞信息內容,對文件大小無限制,文件上傳只能選擇post

   3. request對象是服務器獲取請求信息(從請求頭,請求正文中獲取),我們可以使用request.setCharacterEncoding方法修改請求對象字符編碼信息,但是不能修改地址欄字符編碼。

       get從地址欄傳遞信息,不能使用request.setCharacterEncoding這個方法去修改字符編碼。post從請求正文以form表單形式提交,所以可以使用request.setCharacterEncoding這個方法去修改字符編碼。

      4. 總結: 能夠使用post提交儘量使用post提交。

2、什麼是Servlet?

Servletsun公司提供的一門用於開發動態web資源的技術,是Java語言中編寫Web服務器擴展功能的重要技術,同時它也是JSP技術的底層運行基礎。

  Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java.Servlet被編譯爲平臺中立的字節碼,可以被動態的加載到支持Java技術的Web服務器中運行。

  Servlet是一個基於java技術的Web組件,運行在服務器端,由servlet容器管理,用於生成動態內容。

3、請說一說Servlet的生命週期?

servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,servicedestroy方法表達。

 

Servlet被服務器實例化後,容器運行其init方法,該方法在整個生命週期中只運行一次,用於做一些準備工作,當該方法結束時該Servlet可以處理客戶端請求。

請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGetdoPost)等,該方法在整個生命週期中運行多次,每個請求都使用service方法進行處理。

當服務器決定將實例銷燬的時候調用其destroy方法,該方法在整個生命週期中只運行一次

,用於做一些清除工作。

 

4forward redirect的區別?

1. forward服務器內部跳轉(在當前webapp中跳轉),地址欄不顯示跳轉後的url,

    sendRedirect是地址欄重新發請求,地址欄顯示的是跳轉後的url

 2. forward跳轉時可以通過request共享數據,而sendRedirect不能通過request共享數據。

 3. forward時前面是什麼請求跳轉就是什麼請求,而sendRedirect一定是get請求。

 4. 如果希望訪問其他webapp的請求。

    因爲forward是服務器內部跳轉,只在當前webapp跳轉,所以是完成不了的。

    sendRedirect("http://localhost:8080/userapp/register.html")

     sendRedirect("/userapp/register.html")

    sendRedirect相當於直接在地址欄輸入請求,所以可以成功跳轉。

5ServletConfig對象和ServletContext對象有什麼區別?

一個Servlet對應有一個ServletConfig對象,可以用來讀取初始化參數。

一個webapp對應一個ServletContext對象。

ServletContext對象獲取初始化定義的參數。

ServletContext對象可以通過context.getResourceAsStream("/images/tomcat.gif");或者context.getRealPath("/")

去獲取webapp的資源文件。

  ServletContext對象的setAttribute(String name,Object o)方法可以將對象存儲在Context作用範圍域又稱爲全局作用範圍域,在整個web應用當中可以共享.

  ServletContext對象可以和服務器進行通訊,比如寫信息到服務器的日誌信息當中。。

6Servlet的會話機制?

因爲http協議是無狀態協議,又稱爲一次性連接,所以webapp必須有一種機制

  能夠記住用戶的一系列操作,並且唯一標示一個用戶。

  Cookie: 又稱爲小餅乾,實際就是使用一個短文本保存用戶信息,

          在頁面加載完畢是通過響應寫回客戶端進行保存。

Session: 在服務器保存數據,Session就是單個客戶的一塊內存, 用以存儲數據。

TomcatSessionHashMap的實現。

   request.getSession()Session對象被服務器創建,並且產生一個唯一的SessionID

SessionID會通過Cookie寫回客戶端進行保存。如果Cookie被客戶端禁用,只能使用URL重寫機制。

         Session對象可以使用setAttribute(String name,Object o)將對象存儲在Session作用範圍域中。Session作用範圍域是在瀏覽器打開到瀏覽器關閉。

7Filter是什麼?有什麼作用?

Filter是過濾器,在請求到達Servlet之前或者響應到達客戶端之前截獲請求或者響應,對之進行相應的處理。Struts2的控制器就是使用一個Filter實現的。

8Listener是什麼?有什麼作用?

 Listener是指Servlet中的監聽器。

Listener可以對ServletContext對象、HttpSession對象、ServletRequest對象進行監聽。

9、你瞭解過Servlet3.0嗎?

Servlet3.0相對於Servlet2.0來說最大的改變是引入了Annotation標註來取代xml配置,用於簡化web應用的開發和部署。最主要幾項特性:

1. 新增的註解支持:該版本新增了若干註解,用於簡化 Servlet、過濾器(Filter)和監聽器(Listener)的聲明,這使得 web.xml 部署描述文件從該版本開始不再是必選的了。

2. 異步處理支持:有了該特性,Servlet 線程不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最後才結束該 Servlet 線程。在接收到請求之後,Servlet 線程可以將耗時的操作委派給另一個線程來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少服務器資源的佔用,並且提高 併發處理速度。

3. 可插性支持:熟悉 Struts2 的開發者一定會對其通過插件的方式與包括 Spring 在內的各種常用框架的整合特性記憶猶新。將相應的插件封裝成 JAR 包並放在類路徑下,Struts2 運行時便能自動加載這些插件。現在 Servlet 3.0 提供了類似的特性,開發者可以通過插件的方式很方便的擴充已有 Web 應用的功能,而不需要修改原有的應用。

10JSP是什麼?有什麼特點?

JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。在Servlet當中開發嵌入html的腳本,會非常的繁瑣。JSP支持在html中直接嵌入java腳本,JSPServlet的簡化設計,通常在開發中用來做展示數據。在實際開發中,Servlet負責響應請求並處理請求產生數據,數據的顯示由JSP負責。

11JSP的常用指令有哪些?

<% @ page %>  <% @ include %> <% @ taglib %>

 

12JSP中動態INCLUDE與靜態INCLUDE的區別?

動態INCLUDEjsp:include動作實現 

<jsp:include page=included.jsp />它總是會檢查所含文件中的變化適合用於包含動態頁面並且可以帶參數.

 靜態INCLUDE<%@ include file=included.htm %>指令實現,不會檢查所含文件的變化適用於包含靜態頁面.

 

13JSP有哪些動作?分別是什麼?

JSP共有以下7種基本動作

jsp:include在頁面被請求的時候引入一個文件。 

jsp:useBean尋找或者實例化一個JavaBean 

jsp:setProperty設置JavaBean的屬性。 

jsp:getProperty輸出某個JavaBean的屬性。 

jsp:forward:把請求轉到一個新的頁面。

Jsp:param: 傳遞參數。

jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECTEMBED標記

 

14JSP有哪些內置對象?作用分別是什麼?

JSP共有以下9個內置的對象:

request請求對象

response 響應對象

pageContext 頁面上下文對象

session 會話對象

application web應用上下文對象

out 輸出對象

config 配置信息對象

page JSP網頁本身

exception 針對錯誤網頁,未捕捉的例外

 

request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,並且提供了幾個用於獲取cookie, header, session數據的有用的方法。

   response表示HttpServletResponse對象,並提供了幾個用於設置送回 瀏覽器的響應的方法(如cookies,頭信息等)

   out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。

   pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各種範圍的名字空間、servlet相關的對象的API,並且包裝了通用的servlet相關功能的方法。

   session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息

   applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息

   config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。

   page表示從該頁面產生的一個servlet實例

 

15JSPServlet有哪些相同點和不同點?

JSPServlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"servlet"

ServletJSP最主要的不同點在於,Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。

JSP的情況是JavaHTML可以組合成一個擴展名爲.jsp的文件。

在實際項目開發當中,JSP側重於視圖,Servlet主要用於控制邏輯。

數據庫部分

1、 如何獲得高效的數據庫邏輯結構?

從關係數據庫的表中刪除冗餘信息的過程稱爲數據規範化,是得到高效的關係型數據庫表的邏輯結構最好和最容易的方法。

規範化數據時應執行以下操作:

1.將數據庫的結構精簡爲最簡單的形式

2.從表中刪除冗餘值

3.標識所有依賴與其他數據的數據

規範化過程有幾個階段,分別稱作第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、第四範式(4NF)以及第五範式(5NF)。對於所有的實際應用,3NF已經足夠了。

2、 數據庫三範式是什麼?

第一範式(1NF):字段具有原子性,不可再分。所有關係型數據庫系統都滿足第一範式)

數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作爲一個整體,無法區分哪部分是姓,哪部分是名,如果要區分出姓和名,必須設計成兩個獨立的字段。

 

 第二範式(2NF):

第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。

要求數據庫表中的每個實例或行必須可以被惟一地區分。通常需要爲表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱爲主關鍵字或主鍵。

 

第二範式(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分通常需要爲表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。

 

第三範式(3NF)是在第二範式的基礎上建立起來的,即滿足第三範式(3NF)必須先滿足第二範式(2NF)。

第三範式(3NF)要求非主關鍵字不能依賴於其他非主關鍵字。即非主關鍵字之間不能有函數(傳遞)依賴關係.即不能從一個表的某個字段推出該表的另一個字段。 

 

滿足三範式的設計,基本可以解決數據冗餘、插入異常、更新異常、刪除異常等數據存儲問題。

3、 SQL語句分爲哪幾種?

SQL語句主要可以劃分爲以下幾類:

DDL(Data Definition Language):數據定義語言,定義對數據庫對象(庫、表、列、索引)的操作。

包括:CREATEDROPALTERRENAMETRUNCATE

DML(Data Manipulation Language): 數據操作語言,定義對數據庫記錄的操作。

包括:INSERTDELETEUPDATESELECT

DCL(Data Control Language): 數據控制語言,定義對數據庫、表、字段、用戶的訪問權限和安全級別。

包括:GRANTREVOKE

Transaction Control:事務控制

包括:COMMITROLLBACKSAVEPOINT

4、 Deletetruncaatedrop都是刪除語句,它們有什麼分別?

delete 屬於DML語句,刪除數據,保留表結構,需要commit,可以回滾,如果數據量大,很慢。

truncate 屬於DDL語句,刪除所有數據,保留表結構,自動commit,不可以回滾,一次全部刪除所有數據,速度相對較快。

Drop屬於 DDL語句,刪除數據和表結構,不需要commit,刪除速度最快。

 

5、 Wherehaving都是條件篩選關鍵字,它們有什麼分別?

WHERE是在數據分組前進行條件過濾, HAVING子句是在數據分組後進行條件過濾,WHERE子句中不能使用聚合函數,HAVING子句可以使用聚合函數。

6、 如何提升數據查詢的效率?

1.首先檢查表的結構是否合理,因爲採用多表查詢的時候,看主外鍵的引用關係是否適當.如果不適當則重新設置表結構.如果是應用中的系統,則不需要更改表的字段,只更改主外鍵關係.如果數據庫中有較多的數據,還應採用索引提高查詢效率.

 

2.利用索引(index)對查詢進行優化,index可以避免對錶數據的全面掃描,當你以某個字段建立一個索引的時候,數據庫就會生成一個索引頁,索引頁不單單保存索引的數據,還保存了索引在數據庫的具體的物理地址,能夠很快的定位查找到要找的記錄

 

3. 如果表的列很少,不適合建索引.表數據很少查詢,而經常做insertdeleteupdate動作,不適合建所以。因爲Oracle需要對索引額外維護。建立索引後,select會快, 當執行過多次的insert,delete,update,會出現索引碎片,影響查詢速度,我們應該對索引進行重組(即drop掉索引重新create

 

4.索引的類型分爲:

B-樹索引:適合於大量的增、刪、改,大多數數據的索引默認類型。

位圖索引:適合於決策支持系統

HASH索引、分區索引等。

 

7、 什麼是數據庫事務?

事務是作爲一個邏輯單元執行的一系列操作,要麼一起成功,要麼一起失敗。

一個邏輯工作單元必須有四個屬性,稱爲 ACID(原子性、致性、隔離性和持久性)屬性,只有這樣才能成爲一個事務。

原子性 :事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。

一致性 :事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。

隔離性 :由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這爲可串行性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執的狀態相同。

持久性 :事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

8、 什麼是數據庫事務的隔離級別?

多個線程開啓各自事務操作數據庫中數據時,數據庫系統要負責隔離操作,以保證各個線程在獲取數據時的準確性。

數據庫共定義了四種隔離級別:

Serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(串行化)

Repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)

Read committed:可避免髒讀情況發生(讀已提交)。

Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)

 

9、 如何刪除表中的重複數據,只保留一條記錄?

1.通過創建臨時表

creat table tbl_tmp as select distinct * from tbl;

truncate table tbl;//清空表記錄

insert into tbl select * from tbl_tmp;//將臨時表中的數據插回來。

 

2.利用rowid

delete from tbl where rowid in

(select a.rowid from tbl a, tbl b

where a.rowid>b.rowid

and a.col1=b.col1 and a.col2 = b.col2)

 

3.利用maxmin函數

delete from tbl a where rowid not in

(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);

//這裏max使用min也可以

 

delete from tbl where rowid not in

(select max(rowid) from tbl tgroup by t.col1, t.col2);

 

10、 如何通過sql語句完成分頁?

 

 

oracle

 

select rownum,bookId from

[rownum是僞列名,bookId是列名]

(select rownum row_id,bookId from xiaoWJ_books t)

t where row_id between 10 and 20

[1020條記錄]

 

mysql

 

sql="select * from xiaoWJ_books LIMIT ?,?";

第一個?是開始位置,第二個?是每頁顯示多少

 

 

sqlServer2000

 

select top "+pageSize+" * from xiaoWJ_books where bookId not in

[去掉前面 "+pageBegin+" 條後顯示 "+pageSize+" 條記錄]

(select top "+pageBegin+" bookId from xiaoWJ_books order by bookId)

[查出整個表的前 "pageBegin" 條記錄]

order by bookId"

11、 Oracle數據常用的備份與恢復?

Oracle的備份與恢復有三種標準的模式,大致分爲兩大類,備份恢復(物理上的)以及導入導出(邏輯上的),而備份恢復又可以根據數據庫的工作模式分爲非歸檔模式(Nonarchivelog-style)和歸檔模式(Archivelog-style),通常,我們把非歸檔模式稱爲冷備份,而相應的把歸檔模式稱爲熱備份。

邏輯備份方式的方法,利用Export可將數據從數據庫中提取出來,利用Import則可將提取出來的數據送回到Oracle數據庫中去。如:

導出數據文件: exp scott/tiger file=d:/scott.dmp

導入數據文件:  imp scott/tiger file=:/scott.dmp

 

12、 Oracle的數據優化(經常被問到)

Oracle數據庫舉例:

(a-G要求掌握,H一般爲DBA操作,瞭解就可以了)

a

建庫:已知將保存海量數據的時候,因爲Oracle是通過用戶來管理數據的,

第一步我們先建一個tableaspace(假設表空間名爲TEST)

然後建立用戶TEST(一般情況下用戶名和表空間同名)

建立的用戶TEST使用已建立的tablespace(TEST).

這樣做是避免訪問上產生熱點。

b

建表:建表時最好依照第三範式去建表(請回答三個範式)

這樣可以最大程度避免出現數據冗餘、插入、刪除和更新異常,保證數據完整性。

而且表結構合理的情況下,可以加快查詢速度。

c

索引:在經常查詢的字段上面建立索引,

利用index對查詢進行優化,(index可以避免對錶的一個全面掃描)

原理:當以某個字段建立一個索引的時候,數據庫就會生成一個索引頁,

索引頁不單單保存索引的數據,還保存了索引在數據庫的具體的物理地址,

當我們查詢數據時,oracle會先查索引頁,這樣就能夠很快的定位查找到要找的記錄)

注意:

如果表的列很少,不適合建索引.

當執行過多次的insert,delete,update,會出現索引碎片,

影響查詢速度,我們應該對索引進行重組.

D:

sql語句的優化:

多使用共享語句

儘量使你的sql語句能夠使用索引。

怎樣使sql語句能夠使用到索引呢:

sql語句中包含not in,<>,is null,is not null,like '%%'的時候不會用索引。

IN: in會拆成一堆or,可以使用表的索引。

NOT IN:強列推薦不使用,因爲它不能應用表的索引。

<> 操作符(不等於): 不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。

優化方案:用其它相同功能的操作運算代替,如a<>0 改爲 a>0 or a<0;a<>’’ 改爲 a>’’.

IS NULL IS NOT NULL操作(判斷字段是否爲空):

判斷字段是否爲空一般是不會應用索引的,因爲B樹索引(oracle大多是使用B樹索引)是不索引空值的。

優化方案:用其它相同功能的操作運算代替,如 a is not null 改爲 a>0 a>’’等。

is null 時,用一個缺省值代替空值,例如業擴申請中狀態字段不允許爲空,缺省爲申請。

LIKELIKE操作符可以應用通配符查詢,裏面的通配符組合可能達到幾乎是任意的查詢,但是如果用得不好則會產生性能上的問題,

優化方案:LIKE %001%’ 這種查詢不會引用索引,會產生全表掃描,

LIKE 001%’則會引用範圍索引。進行範圍的查詢,性能肯定大大提高。

E

多表查詢時,一般一個大表關聯幾個小表,最好不要幾個大表相關聯,那樣也會影響到查詢速度。

F

oralce訪問表中的數據共有三種方式,全表掃描,通過索引掃描,使用共享語句(一模一樣)

select id,name from tb_sutdent;

Select id,name from tb_sutdent;

我們JDBC查詢中使用PreparedStatement實際上就是使用共享語句。

所以我們要多使用共享語句來加快查詢速度。

G

經常查詢的SQL可以寫成存儲過程。

H

當表數據達到幾十到幾百GB時,就要考慮對錶進行分區了,

分區的優點:

1.增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用

2.維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;

3.均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能;

4.改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。

分區的幾種方法:範圍分區 Hash分區(散列分區) ,複合分區 。

應用:實際項目中大多使用範圍分區,

例如按時間範圍(日期字段)來分區,如2005-2006數據作爲一個分區,2006-2007作爲一個分區。

JDBC部分

JDBC部分的面試題,可能覆蓋數據庫和JDBC等相關內容,這些知識基本都可通過《輕量級JavaEE企業應用實戰(第三版)整合開發》一書找到詳細解答。這部分面試題大部分從網絡收集、整理,也有部分題目來自瘋狂軟件學員面試之後的反饋。

13、 JDBC操作數據庫的步驟 ?

1. 註冊數據庫驅動。

2. 建立數據庫連接。

3. 創建一個Statement

4. 執行SQL語句。

5. 處理結果集。

6. 關閉數據庫連接。

2.JDBC中的Statement PreparedStatement的區別?

PreparedStatement是預編譯的SQL語句,效率高於Statement

PreparedStatement支持?操作符,相對於Statement更加靈活。

PreparedStatement可以防止SQL注入,安全性高於Statement

 

3.JDBC中大數據量的分頁解決方法?

最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。

sql語句分頁,不同的數據庫下的分頁方案各不一樣,下面是主流的三種數據庫的分頁sql

oracle:

 

select * from

(select *,rownum as tempid from student )  t

where t.tempid between " + pageSize*(pageNumber-1) + " and " + pageSize*pageNumber

 

mysql:

select * from students limit " + pageSize*(pageNumber-1) + "," + pageSize;


sql server:

select top " + pageSize + " * from students where id not in +

 (select top " + pageSize * (pageNumber-1) +  id from students order by id) +

 "order by id;

 

4.說說數據庫連接池工作原理和實現方案?

工作原理:JAVA EE服務器啓動時會建立一定數量的池連接,並一直維持不少於此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接並將其表記爲忙。如果當前沒有空閒連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。當使用的池連接調用完成後,池驅動程序將此連接表記爲空閒,其他調用就可以使用這個連接。

實現方案:返回的Connection是原始Connection的代理,代理Connectionclose方法,當調用close方法時,不是真正關連接,而是把它代理的Connection對象放回到連接池中,等待下一次重複利用。

流行的框架部分

流行框架部分的面試題,可能覆蓋StrutsHibernateSpring等相關內容,這些知識基本都可通過《輕量級JavaEE企業應用實戰(第三版)整合開發》一書找到詳細解答。這部分面試題大部分從網絡收集、整理,也有部分題目來自瘋狂軟件學員面試之後的反饋。

 

1什麼是MVC模式?   

MVC (Model View Controller) 是一個設計模式,使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。M是指數據模型,V是指用戶界面,C則是控制器。使用MVC的目的是將MV的實現代碼分離,從而使同一個程序可以應用於不同的表現形式。

MODEL: 封裝了所有的商業邏輯以及規則。通常被JavaBeanEJB實現。

VIEW: 使用商業邏輯處理後的結果並構建呈現給客戶端的響應。通常被JSP實現。 CONTROLLER:管理和控制所有用戶和應用程序間的交互。通常是一個servlet接收用戶的請求並把所有的輸入轉交給實際工作的MODEL。最後調用JSP返回輸出。

MVC模式的好處:

1.各施其職,互不干涉

MVC模式中,三個層各施其職,所以如果一旦哪一層的需求發生了變化,就只需要更改相應的層中的代碼而不會影響到其它層中的代碼。

2.有利於開發中的分工

MVC模式中,由於按層把系統開,那麼就能更好的實現開發中的分工。網頁設計人員可以進行開發視圖層中的JSP,對業務熟悉的開發人員可開發業務層,而其它開發人員可開發控制層。

3.有利於組件的重用

分層後更有利於組件的重用。如控制層可獨立成一個能用的組件,視圖層也可做成通用的操作界面。

Struts就是一個基於MVC模式的框架。

2.請說說Struts1Struts2的區別?

特性

Struts1

Struts2

Action

Struts1.x要求Action類要擴展自一個抽象基類。Struts1.x的一個共有的問題是面向抽象類編程而不是面向接口編程。

Struts2Action類實現了一個Action接口,連同其他接口一起來實現可選擇 和自定義的服務。Struts2提供一個名叫ActionSupport的基類來實現一般使用的接口。當然,Action接口不是必須的。任何使用 execute方法的POJO對象可以被當作Struts 2Action對象來使用。

線程模型

Struts1.x Action類是單例類,因爲只有一個實例來控制所有的請求。單例類策略造成了一定的限制,並且給開發帶來了額外的煩惱。Action資源必須是線程安全 或者同步的。

Struts2 Action對象爲每一個請求都實例化對象,所以沒有線程安全的問題。(實踐中,servlet容器給每一個請求產生許多丟棄的對象,並且不會導致性能和 垃圾回收問

Servlet依賴

Struts1.xAction類依賴於servlet API,當Action被調用時,以HttpServletRequestHttpServletResponse作爲參數傳給execute方法。

Struts2Action和容器無關。Servlet上下文被表現爲簡單的Maps,允 許Action被獨立的測試。Struts2Action可以訪問最初的請求(如果需要的話)。但是,儘可能避免或排除其他元素直接訪問 HttpServletRequestHttpServletResponse

易測性

測試Struts1.x的主要問題是execute方法暴露了Servlet API這使得測試要依賴於容器)。第三方的擴展,如Struts TestCase,提供了一套Struts1的模擬對象(來進行測試)。

Struts2Action可以通過初始化、設置屬性、調用方法來測試。依賴注入的支持也是測試變得更簡單。

捕獲輸入

Struts1.x使用ActionForm對象來捕獲輸入。象Action一樣,所有的 ActionForm必須擴展基類。因爲其他的JavaBean不能作爲ActionForm使用,開發者經常創建多餘的類來捕獲輸入。 DynaBeans可以被用來作爲替代ActionForm的類來創建。但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有 冗餘的javabean)。

Struts2直接使用Action屬性作爲輸入屬性,消除了對第二個輸入對象的需求。輸入 屬性可能是有自己()屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm 模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven 特性簡化了taglibPOJO輸入對象的引用。

表達式語言

Struts1.x整合JSTL,所以它使用JSTL的表達式語言。表達式語言有基本的圖形對象移動,但是對集合和索引屬性的支持很弱。

Struts2使用JSTL,但是也支持一個更強大和靈活的表達式語言--”Object Graph Notation Language” (OGNL)

將值綁定到頁面

Struts1.x使用標準JSP機制來綁定對象到頁面上下文。

Struts2使用“ValueStack”技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允 許通過一系列名稱相同但類型不同的屬性重用頁面(view

類型轉換

Struts1.xActionForm屬性經常都是StringStruts 1.x使用Commons-Beanutils來進行類型轉換。轉換每一個類,而不是爲每一個實例配置。

Struts2使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

驗證

Struts1.x支持在ActionFormvalidate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。

Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持 chain校驗子屬性

Action執行控制

Struts1.x支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。

Struts2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。

3. 請說說Struts2的工作流程。(也可以畫圖說明)

struts2.png

4. Struts2的功能擴展點有哪些?

Interceptor及其相關子類

TypeConverter及其相關子類

Validator及其相關子類

Result及其相關子類

ObjectFactory及其相關子類

 

5. 請描述一下Struts2的值棧結構,以及它是如何工作的?

值棧 Value Stack

值棧是Struts2框架的核心概念。所有的核心組件都以某種方式與之進行交互,它提供對上下文信息和執行環境中元素的訪問機制。值棧的內容由如下4個層級組成。

1.臨時對象

這些對象在請求處理中需要臨時保存,比如集合中當前正在被迭代的元素。

2.模型對象

action實現了ModelDriven接口,模型對象就會被存放在棧中,在action對象前。如果action沒有實現該接口,這個級別的內容將不存在。

3.Action對象

此對象是當前正在執行的action

4.命名對象 即 OGNL上下文環境

任何對象都可以被賦予一個標識符而成爲命名對象。Struts2內建的命名對象有:#application#session#request#attr#parameters

使用值棧不需要壓棧和彈棧,可直接使用OGNL表達式來查找或求值。OGNL表達式會在每個層級測試,層級測試的順序按照層級順序進行。如果各層級都沒有求出結果,那麼則返回null值。

 

6. Struts2裏面有什麼隱式對象?

Struts 2.1 的隱式對象

(這些隱式對象都是Map類型)

parameters 用於訪問請求參數

request  用於訪問HttpServletRequest的屬性

session  用於訪問HttpSession的屬性

application 用於訪問ServletContext的屬性

attr   用於訪問各作用域內的屬性,將依次搜索 request > session > application

 

7. Struts2Action中獲取request對象的幾種方式?

1. 通過ActionContext.getSession獲取

2. 通過ServletActionContext.getRequest()獲取

3. 通過SessionAware接口注入

4. 通過ServletRequestAware接口注入

 

 

8. 請說說你對Struts2的攔截器的理解。

Struts2攔截器是在訪問某個ActionAction的某個方法,字段之前或之後實施攔截,並且Struts2攔截器是可插拔的,攔截器是AOP的一種實現.

攔截器棧(Interceptor Stack)類似於過濾器鏈。攔截器棧就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器棧的攔截器就會按其之前定義的順序被調用。

Struts2的攔截器和Filter類似。在執行Actionexecute方法之前,Struts2會首先執行在struts.xml中引用的攔截器,完成一系列的功能,在執行完所有引用的攔截器的intercept方法後,會執行Actionexecute方法。

 

6. 什麼是ORM思想?常用的基於ORM的框架有哪些?各有什麼特點?

ORM的全稱是Object-Relational Mapping,即對象關係映射。ORM思想的提出來源於對象與關係之間相悖的特性。我們很難通過對象的繼承與聚合關係來描述數據表中一對一、一對多以及多對多的關係。而面向對象思想中有關抽象與多態的原理,也無法通過關係數據庫的SQL語句得以彰顯。因此,我們需要在面向對象與面向關係之間找到一個平衡點,ORM於是應運而生。

 

目前ORM框架的產品非常之多,除了個大公司、組織的產品外,其他一些小團隊也在推出自己的ORM框架。目前流行的ORM框架有如下這些產品:

1Enitiy EJBEnitiy EJB實際上也是一種ORM技術,這是一直備受爭議的組件技術。事實上,EJBJava EE的蓬勃發展贏得了極高的聲譽,EJB作爲一種重量級、高花費的ORM技術具有不可比擬的優勢。就其他架構設計來講,依然非常優秀。即使現在十分流行的輕量級Java EE架構,其實質是對經典Java EE架構的模仿——雖然存在些許的改進。EJB3.1也採取了低侵入式的設計,增加了Annotation,也具有極大的吸引力。

2Hibernate:目前最流行的開源ORM框架,已經被選作JBoss的持久層解決方案。整個HIbernate項目也一併投入了Jboss的懷抱,而JBoss又加入了RedHat組織,所以現在Hibernate屬於RedHat 的一部分。Hibernate 靈巧的設計、優秀的性能,還有其豐富的文檔都是其風靡全球的重要因素。

3iBatisApache軟件基金組織的子項目。與其稱它爲一種ORM框架,不如稱它爲一中“SQL Mapping”框架。曾經在J2EE的開發中扮演非常重要的角色,但因爲不支持存粹的面向對象操作,因此現在逐漸地被取代。但是在一些公司,依然佔有一席之地,特別是一些對數據訪問特別靈活的地方,iBatis更加的靈活,它允許開發人員直接編寫SQL語句。

4TopLinkOracle公司的產品,作爲一個遵循OTN協議的商業產品,TopLink 在開發過程中可以自由地下載和使用,但是一旦作爲商業產品被使用,則需要收取費用。由於這一點,TopLink 的市場佔有率不高。

5OBJApache軟件基金組織的子項目。另一個開源的ORM框架,可以說是Apache作爲iBatis之後的取代產品,也是非常優秀的O/R Mapping框架,但是由於Hibernate 的廣芒太盛,所以並未有廣泛的使用,而且由於OJB的開發文檔不是很多,這也影響了OJB的流行。

7 .請說說你對Hibernat的理解?JDBCHibernate各有什麼優勢和劣勢?

Hibernate是一個輕量級的持久層開源框架,它是連接Java應用程序和關係數據庫的中間件,負責Java對象和關係數據之間的映射.Hibernate內部對JDBC API進行了封裝,負責Java對象的持久化.因爲它封裝了所有的數據訪問細節,使得業務邏輯層可以專注於實現業務邏輯.

它是一種優秀的ORM映射工具,提供了完善的對象-關係映射服務,開發過程不依賴容器,靈活性非常大,可以無縫集成到任何一個java系統中.

 

JDBCHibernate都是用於數據持久化操作的。

JDBC:

1.實現業務邏輯的代碼和訪問數據庫的代碼混雜在一起,使程序結構不清晰,可讀性差.

2.Java是面向對象的,sql是面向關係的.兩者混在一起,程序員不能完全的運用面向對象的思維來編寫程序.

3.業務邏輯和關係數據模型綁定,如果關係數據模型發生變化(如更改表結構),就必須手動修改程序裏所有相關的sql語句,增加了維護軟件的難度.如果sql語句有語法錯誤,編譯是不能檢查這種錯誤,只有運行時才能發現錯誤,增加了程序的調試難度.

   4.數據庫移植困難。

 Hibernate

   Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

8、寫出Hibernate中核心接口/類的名稱,並描述他們各自的責任?

Hibernate的核心接口一共有5個,分別爲:SessionSessionFactoryTransactionQueryConfiguration。這5個核心接口在任何開發中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務控制。下面對這五的核心接口分別加以介紹。
Session接口:Session接口負責執行被持久化對象的CRUD操作。但需要注意的是Session對象是非線程安全的。
SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建 Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個 SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory
Configuration接口:Configuration接口負責配置並啓動Hibernate,創建SessionFactory對象。在 Hibernate的啓動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然後創建SessionFactory對象。
Transaction接口:Transaction接口負責事務相關的操作。它是可選的,開發人員也可以設計編寫自己的底層事務處理代碼。
QueryCriteria接口:QueryCriteria接口負責執行各種數據庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。

 

9Hibernatesession.load()session.get()有什麼分別?

其區別在於:

Get會發送查詢語句提取數據,而load方法當對象使用時纔去數據庫查詢。
如果未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException
Load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。
load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。

 

10. Hibernate實體的三種狀態是什麼?各有什麼特點?

瞬時態(Transient)、 持久態(Persistent)、脫管態(Detached)。處於持久態的對象也稱爲PO(Persistence Object),瞬時對象和脫管對象也稱爲VOValue Object)。

瞬時態:

沒有持久化標示符,數據庫中無對應記錄。當執行savepersist方法可以變成持久態。

持久態
處於該狀態的對象在數據庫中具有對應的記錄,並擁有一個持久化標識。如果是用hibernatedelete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象不再與數據庫的記錄關聯。當一個session執行close()clear()evict()之後,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數據庫識別值,但它已不在HIbernate持久層的管理之下。
持久對象具有如下特點:
1. session實例關聯;
2. 在數據庫中有與之關聯的記錄。


脫管態
當與某持久對象關聯的session被關閉後,該持久對象轉變爲脫管對象。當脫管對象被重新關聯到session上時,並再次轉變成持久對象。
脫管對象擁有數據庫的識別值,可通過update()saveOrUpdate()等方法,轉變成持久對象。
脫管對象具有如下特點:
1. 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
2. 比瞬時對象多了一個數據庫記錄標識值。

 

11. 如何進行Hibernate的性能優化?

大體上,對於HIBERNATE性能調優的主要考慮點如下:

數據庫設計調整

HQL優化

API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)

主配置參數(日誌,查詢緩存,fetch_size, batch_size)

映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)

一級緩存的管理

針對二級緩存,還有許多特有的策略

事務控制策略。

(下面是說明不需要回答)

1 數據庫設計

a) 降低關聯的複雜性

b) 儘量不使用聯合主鍵

c) ID的生成機制,不同的數據庫所提供的機制並不完全一樣

d) 適當的冗餘數據,不過分追求高範式

2 HQL優化

HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯,HQL的優化技巧同普通的SQL優化技巧一樣,可以很容易在網上找到一些經驗之談。

3 主配置

a) 查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執行時可以利用緩存數據。但是,查詢緩存在一個交易系統(數據變更頻繁,查詢條件相同的機率並不大)中可能會起反作用:它會白白耗費大量的系統資源但卻難以派上用場。

b) fetch_size,同JDBC的相關參數作用類似,參數並不是越大越好,而應根據業務特徵去設置

c) batch_size同上。

d) 生產系統中,切記要關掉SQL語句打印。

4 緩存

a) 數據庫級緩存:這級緩存是最高效和安全的,但不同的數據庫可管理的層次並不一樣,比如,在ORACLE中,可以在建表時指定將整個表置於緩存當中。

b) SESSION緩存:在一個HIBERNATE SESSION有效,這級緩存的可干預性不強,大多於HIBERNATE自動管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時增加十萬條記錄,按常規方式進行,很可能會發現OutofMemeroy的異常,這時可能需要手動清除這一級緩存:Session.evict以及 Session.clear

c) 應用緩存:在一個SESSIONFACTORY中有效,因此也是優化的重中之重,因此,各類策略也考慮的較多,在將數據放入這一級緩存之前,需要考慮一些前提條件:

i. 數據不會被第三方修改(比如,是否有另一個應用也在修改這些數據?)

ii. 數據不會太大

iii. 數據不會頻繁更新(否則使用CACHE可能適得其反)

iv. 數據會被頻繁查詢

v. 數據不是關鍵數據(如涉及錢,安全等方面的問題)

緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用於很少變更的靜態數據/歷史數據)nonstrict-read- writeread-write(比較普遍的形式,效率一般)transactional(JTA中,且支持的緩存產品較少)

d) 分佈式緩存:c)的配置一樣,只是緩存產品的選用不同,在目前的HIBERNATE中可供選擇的不多,oscache, jboss cache,目前的大多數項目,對它們的用於集羣的使用(特別是關鍵交易系統)都持保守態度。在集羣環境中,只利用數據庫級的緩存是最安全的。

5 延遲加載

a) 實體延遲加載:通過使用動態代理實現

b) 集合延遲加載:通過實現自有的SET/LISTHIBERNATE提供了這方面的支持

c) 屬性延遲加載:

6 方法選用

a) 完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什麼方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄(List /Set/Bag/Map)進行處理,很可能導致內存不夠的問題,而如果用基於遊標(ScrollableResults)Iterator的結果集,則不存在這樣的問題。

b) Sessionload/get方法,前者會使用二級緩存,而後者則不使用。

c) Querylist/iterator,如果去仔細研究一下它們,你可能會發現很多有意思的情況,二者主要區別(如果使用了Spring,在 HibernateTemplate中對應find,iterator方法):

i. list只能利用查詢緩存(但在交易系統中查詢緩存作用不大),無法利用二級緩存中的單個實體,但list查出的對象會寫入二級緩存,但它一般只生成較少的執行SQL語句,很多情況就是一條(無關聯)

ii. iterator則可以利用二級緩存,對於一條查詢語句,它會先從數據庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對於緩存中沒有的記錄,再構造語句從數據庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用iterator會產生N+1SQL語句(N爲符合條件的記錄數)

iii. 通過iterator,配合緩存管理API,在海量數據查詢中可以很好的解決內存問題,如:

while(it.hasNext()){

YouObject object = (YouObject)it.next();

session.evict(youObject);

sessionFactory.evice(YouObject.class, youObject.getId());

}

如果用list方法,很可能就出OutofMemory錯誤了。

iv. 通過上面的說明,我想你應該知道如何去使用這兩個方法了。

7 集合的選用

HIBERNATE 3.1文檔的“19.5. Understanding Collection performance”中有詳細的說明。

8 事務控制

事務方面對性能有影響的主要包括:事務方式的選用,事務隔離級別以及鎖的選用

a) 事務方式選用:如果不涉及多個事務管理器事務的話,不需要使用JTA,只有JDBC的事務控制就可以。

b) 事務隔離級別:參見標準的SQL事務隔離級別

c) 鎖的選用:悲觀鎖(一般由具體的事務管理器實現),對於長事務效率低,但安全。樂觀鎖(一般在應用級別實現),如在HIBERNATE中可以定義 VERSION字段,顯然,如果有多個應用操作數據,且這些應用不是用同一種樂觀鎖機制,則樂觀鎖會失效。因此,針對不同的數據應有不同的策略,同前面許多情況一樣,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特徵有足夠的瞭解。

9、 批量操作

即使是使用JDBC,在進行大批數據更新時,BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設置batch_size來讓其支持批量操作。

舉個例子,要批量刪除某表中的對象,如“delete Account”,打出來的語句,會發現HIBERNATE找出了所有ACCOUNTID,再進行刪除,這主要是爲了維護二級緩存,這樣效率肯定高不了,在後續的版本中增加了bulk delete/update,但這也無法解決緩存的維護問題。也就是說,由於有了二級緩存的維護問題,HIBERNATE的批量操作效率並不盡如人意!

從前面許多要點可以看出,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特徵有足夠的瞭解,一般的,優化方案應在架構設計期就基本確定,否則可能導致沒必要的返工,致使項目延期,而作爲架構師和項目經理,還要面對開發人員可能的抱怨,必竟,我們對用戶需求更改的控制力不大,但技術/架構風險是應該在初期意識到並制定好相關的對策。

還有一點要注意,應用層的緩存只是錦上添花,永遠不要把它當救命稻草,應用的根基(數據庫設計,算法,高效的操作語句,恰當API的選擇等)纔是最重要的。

 

11.比較HQLCriteriaNative-SQL這三者做查詢的區別,以及應該如何進行選擇?

HQL功能很強大,適合各種情況,但是動態條件查詢構造起來很不方便

Criteria 最適合動態查詢,但不太適合統計查詢QBE還不夠強大.只適合簡單的查詢

Native-SQL可以實現特定的數據庫的SQL但是可移植性並不好

大部分查詢都是動態條件查詢首先criteria,甚至使用Hibernate3提供的DetachedCriteria構造好DetachedCriteria再進入Session執行查詢

但是涉及到統計查詢和非常複雜的關聯查詢Criteria就無能爲力了這種情況下選擇使用HQL最後如果涉及到使用某些數據庫的特性的時候就只有選擇Native-SQL

 

12. Hibernate的一級緩存和二級緩存有什麼區別?

第一級緩存由Session實例維護,它是必選的,其中保持了Session當前所有關聯實體的數據,也稱爲內部緩存。而第二級緩存則存在於SessionFactory層次,它是可選的。一級緩存只能爲當前線程的會話緩存,無法給整個應用共享;二級緩存可爲整個應用提供緩存支持。二級緩存可以開啓查詢緩存,而一級緩存不行。

 

13. 你是怎麼看Spring框架的?

Spring是一個輕量級的容器,非侵入性的框架.最重要的核心概念是IOC,並提供AOP概念的實現方式,提供對持久層,事務的支持,對當前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了與它們的相整合的方案.使用Spring,我們能夠減少類之間的依賴性和程序之間的耦合度,最大程度的實現鬆耦合,使程序更加靈活,可擴展性更強.使用Spring,使得開發人員可以真正的專注於業務邏輯,而不是代碼。

14. 請描述一下Spring中一個Bean的完整的生命週期?

bean的生命週期.png

15. 什麼是AOP?

AOPAspect Oriented Programming的縮寫,意爲:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。

AOP是目前軟件開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

AOPOOP的延續,主要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。

Spring中提供了AOP的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。

16. Spring的事務體系中,事務傳播特性:RequiredRequiresNew有何不同?

Required

如果當前存在一個事務,則加入當前事務。如果不存在任何事務,則創建一個新的事務。總之,要至少保證在一個事務中運行。PROPAGATION_REQUIRED通常作爲默認的事務傳播行爲。

RequiresNew

不管當前是否存在事務,都會創建新的事務。如果當前存在事務,會將當前的事務掛起(Suspend)。如果某個業務對象所做的事情不想影響到外層事務,PROPAGATION_REQUIRES_NEW應該是合適的選擇。

 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章