題目

--java基礎(任選2題)

1.Map是否有序?是否存在有順序的Map的實現類,且是如何保證它的順序,或者你是否有更好的實現的方式? 

Map中TreeMap是有序的,通過Comparator來保證有序的,要麼是默認的排序規則進行排序,要麼是給定一個Comparator進行排序,TreeMap通過其構造方法來初始化其持有的Comparator

(1)這個是用keys自然的排序,而且這些key是實現了Comparable接口的,是可以比較的

public TreeMap() {

        comparator = null;

}

(2)這是給定了一個Comparator進行排序的

public TreeMap(Comparator<? superK> comparator) {

       this.comparator = comparator;

}

(3)同(1),給定的這些keys都是可以比較的

public TreeMap(Map<? extends K, ?extends V> m) {

       comparator = null;

       putAll(m);

}

(4)用給定的SortedMap裏的Comparator

public TreeMap(SortedMap<K, ? extendsV> m) {

       comparator = m.comparator();

       try {

            buildFromSorted(m.size(),m.entrySet().iterator(), null, null);

       } catch (java.io.IOException cannotHappen) {

       } catch (ClassNotFoundException cannotHappen) {

       }

}

PS:

紅黑樹的理解:通過2-3樹來理解紅黑樹

HashMap的理解http://www.importnew.com/7099.html

ComparatorComparable的區別:如果比較的key本身已經實現了Comparable接口,那就表示是可以比較的,可以通過Collections.sort(list)進行一個排序;如果沒有實現Comparable接口,可去實現Comparator接口,給定一個比較器XxxComparator,通過Collections.sort(list, new XxxComparator());

 

2.java反射理解,java註解(如何編寫一個annation)

(1)反射的基本概念

在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?答案是肯定的。

這種動態獲取類的信息以及動態調用對象的方法的功能來自於Java 語言的反射(Reflection)機制。

Java 反射機制主要提供了以下功能:

在運行時判斷任意一個對象所屬的類。

在運行時構造任意一個類的對象。

在運行時判斷任意一個類所具有的成員變量和方法。

在運行時調用任意一個對象的方法

Reflection 是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection API取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public,static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的所有信息,並可於運行時改變fields內容或調用methods。在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中。

Class類:代表一個類。

Field 類:代表類的成員變量(成員變量也稱爲類的屬性)。

Method類:代表類的方法。

Constructor 類:代表類的構造方法。

Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法

Proxy類以及InvocationHandler接口:提供了動態生成代理類以及實例的方法

其中,Class類是Reflection API 中的核心類,它有以下方法:

·getName():獲得類的完整名字

·getFields():獲得類的public類型的屬性

·getDeclaredFields():獲得類的所有屬性

·getMethods():獲得類的public類型的方法

·getDeclaredMethods():獲得類的所有方法

·getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name參數指定方法的名字,parameterTypes參數指定方法的參數類型

·getConstructors():獲得類的public類型的構造方法

·getConstructor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes 參數指定構造方法的參數類型

·newInstance():通過類的不帶參數的構造方法創建這個類的一個對象

(2)Spring AOP底層用的原理是動態代理,動態代理的實質是java的反射機制

Spring AOP使用動態代理技術在運行期織入增強代碼,一種是基於JDK的動態代理,一種是基於CGLib的動態代理,JDK本身只提供接口的代理,而不支持類的代理。

    1)JDK的動態代理裏兩個重要的:Proxy類和InvocationHandler接口

     InvocationHandler裏的invoke方法,一般(如代理類或者性能監控代碼)這種代碼類會去實現這個接口,通過method.invoke方法通過java的反射機制間接調用目標對象的方法。

      Object invoke(Object proxy, Method method, Object[] args) throwsThrowable

         proxy:  指代我們所代理的那個真實對象
         method:  指代的是我們所要調用真實對象的某個方法的Method對象
         args:  指代的是調用真實對象某個方法時接受的參數

Proxy中的newProxyInstance(ClassLoaderloader, Class<?>[] interfaces, InvocationHandler h)

     loader: 一般是被代理的目標類

     interfaces: 被代理的目標類的一些接口

     h:代理類

2)CGLib填補了JDK動態代理的空缺,採用非常底層的字節碼技術,可以爲一個類創建子類,並在子類中採用方法攔截的技術攔截所有父類方法的調用,並順勢織入橫切邏輯。其中比較重要的幾個類Enhancer,MethodProxy,MethodInterceptor

   Enhancer可以用來創建一個動態代理對象

   MethodInterceptor裏的intercept(Object paramObject, Method paramMethod, Object[]paramArrayOfObject, MethodProxy paramMethodProxy)方法,它攔截所有目標類方法的調用

   MethodProxy裏的invokeSuper方法,去動態的調用被代理類的方法。

(3)怎麼去寫java註解

1)一般會有@Target,@Retention,@Constraint,@Documented

   ·@Target,註解的作用範圍,如@Target(ElementType.TYPE)//類,接口(包括註解),枚舉

   ·@Retention,表示註解可以保存的時間,如@Retention(RetentionPolicy.RUNTIME)//被虛擬機保存,可用反射機制讀取

   ·@Constraint,這個是在validation-api-1.1.0.Final.jar包裏面的類,如果你要寫自定義的校驗類,可以引入這個jar包,並且在自定義的校驗類裏面寫你的相關校驗

   ·@Documented,說明該註解將被包含在javadoc中

2)比如要寫一個校驗金額的註解

@Target({METHOD, FIELD, ANNOTATION_TYPE})

@Retention(RUNTIME)

@Constraint(validatedBy =BigDecimalValidator.class)

@Documented

public @interface BigDecimalRange

{

                       publicClass<?>[] groups() default {};

                       public Class<? extendsPayload>[] payload() default {};

   long minPrecision() default Long.MIN_VALUE;

                        longmaxPrecision() default Long.MAX_VALUE;

                       intscale() default 0;

}

BigDecimalValidator類裏去寫具體的校驗邏輯,具體要用這個註解的時候可以如下:

/**投資金額**/

@BigDecimalRange( minPrecision = 0,maxPrecision = 11, scale =2)

private BigDecimal amount;

3)我們可以通過反射機制去讀取一個方法的註解信息,在單元測試中也是有廣泛應用的

(4)反射是否真的會讓你的程序性能降低?

1.      反射大概比直接調用慢50~100倍,但是需要你在執行100萬遍的時候纔會有所感覺

2.      判斷一個函數的性能,你需要把這個函數執行100萬遍甚至1000萬遍

3.      如果你只是偶爾調用一下反射,請忘記反射帶來的性能影響

4.      如果你需要大量調用反射,請考慮緩存。

5.      你的編程的思想纔是限制你程序性能的最主要的因素

3.J.U.C併發包內容知多少,寫出1-2個JUC的class實現方式和應用場景

(1)CountDownLatch

CountDownLatch的一個非常典型的應用場景是:有一個任務想要往下執行,但必須要等到其他的任務執行完畢後纔可以繼續往下執行。假如我們這個想要繼續往下執行的任務調用一個CountDownLatch對象的await()方法,其他的任務執行完自己的任務後調用同一個CountDownLatch對象上的countDown()方法,這個調用await()方法的任務將一直阻塞等待,直到這個CountDownLatch對象的計數值減到0爲止。

CountDownLatch類有3個基本元素:

·初始值決定CountDownLatch類需要等待的事件的數量。

·await() 方法, 被等待全部事件終結的線程調用。

·countDown() 方法,事件在結束執行後調用。

具體可參見http://blog.csdn.net/chenssy/article/details/49794141

(2)ReentrantLock的使用

可重入概念 
若一個程序或子程序可以“安全的被並行執行(Parallel computing)”,則稱其爲可重入(reentrant或re-entrant)的。即當該子程序正在運行時,可以再次進入並執行它(並行執行時,個別的執行結果,都符合設計時的預期)。可重入概念是在單線程操作系統的時代提出的。

場景1:如果發現該操作已經在執行中則不再執行(有狀態執行)

a、用在定時任務時,如果任務執行時間可能超過下次計劃執行時間,確保該有狀態任務只有一個正在執行,忽略重複觸發。 
b、用在界面交互時點擊執行較長時間請求操作時,防止多次點擊導致後臺重複執行(忽略重複觸發)。

以上兩種情況多用於進行非重要任務防止重複執行,(如:清除無用臨時文件,檢查某些資源的可用性,數據備份操作等)

場景2:如果發現該操作已經在執行,等待一個一個執行(同步執行,類似synchronized

這種比較常見大家也都在用,主要是防止資源使用衝突,保證同一時間內只有一個操作可以使用該資源。 
但與synchronized的明顯區別是性能優勢(伴隨jvm的優化這個差距在減小)。同時Lock有更靈活的鎖定方式,公平鎖與不公平鎖,而synchronized永遠是公平的。

這種情況主要用於對資源的爭搶(如:文件操作,同步消息發送,有狀態的操作等)

ReentrantLock默認情況下爲不公平鎖

不公平鎖與公平鎖的區別: 
公平情況下,操作會排一個隊按順序執行,來保證執行順序。(會消耗更多的時間來排隊) 
不公平情況下,是無序狀態允許插隊,jvm會自動計算如何處理更快速來調度插隊。(如果不關心順序,這個速度會更快)

場景3:如果發現該操作已經在執行,則嘗試等待一段時間,等待超時則不執行(嘗試等待執行)

這種其實屬於場景2的改進,等待獲得鎖的操作有一個時間的限制,如果超時則放棄執行。 
用來防止由於資源處理不當長時間佔用導致死鎖情況(大家都在等待資源,導致線程隊列溢出)。

場景4:如果發現該操作已經在執行,等待執行。這時可中斷正在進行的操作立刻釋放鎖繼續下一操作

synchronized與Lock在默認情況下是不會響應中斷(interrupt)操作,會繼續執行完。lockInterruptibly()提供了可中斷鎖來解決此問題。(場景2的另一種改進,沒有超時,只能等待中斷或執行完畢)

這種情況主要用於取消某些操作對資源的佔用。如:(取消正在同步運行的操作,來防止不正常操作長時間佔用造成的阻塞)

 

--設計模式

1.假設一個A類變到B類,那麼你用適配器怎麼完成    (內)

 

--DB

1.數據庫內、外網如何交互的,如果交互給你做,你怎麼做?(內)

網閘技術,詳見http://zhaisj.blog.51cto.com/219066/40887/

2.數據庫通常的優化方案,使用過什麼優化工具(外),具體如何優化,index的數據結構怎樣 (內、外)

(1)優化方案:http://www.cnblogs.com/bicabo/archive/2012/09/05/2672669.html

(2)優化工具:http://blog.itpub.net/35489/viewspace-764856/

(3)index的數據結構:見(1)

--WebService

1.webService介紹,是怎麼編寫的,rest的幾種method,區別是什麼,http的幾種狀態(內、外)

(1)webservice簡介

Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,並通過UDDI進行註冊。

XML:(Extensible Markup Language)擴展型可標記語言。面向短期的臨時數據處理、面向萬維網絡,是Soap的基礎。

Soap:(Simple Object Access Protocol)簡單對象存取協議。是XML Web Service 的通信協議。當用戶通過UDDI找到你的WSDL描述文檔後,他可以通過SOAP調用你建立的Web服務中的一個或多個操作。SOAP是XML文檔形式的調用方法的規範,它可以支持不同的底層接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用於說明一組 SOAP 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。

UDDI (Universal Description, Discovery, andIntegration) 是一個主要針對Web服務供應商和使用者的新項目。在用戶能夠調用Web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI利用SOAP消息機制(標準的XML/HTTP)來發布,編輯,瀏覽以及查找註冊信息。它採用XML格式來封裝各種不同類型的數據,並且發送到註冊中心或者由註冊中心來返回需要的數據。

調用原理:

Web服務有兩層含義:1、是指封裝成單個實體併發布到網絡上的功能集合體;2、是指功能集合體被調用後所提供的服務。簡單地講,Web服務是一個URL資源,客戶端可以通過編程方式請求得到它的服務,而不需要知道所請求的服務是怎樣實現的,這一點與傳統的分佈式組件對象模型不同。

Web服務的體系結構是基於Web服務提供者、Web服務請求者、Web服務中介者三個角色和發佈、發現、綁定三個動作構建的。簡單地說,Web服務提供者就是Web服務的擁有者,它耐心等待爲其他服務和用戶提供自己已有的功能;Web服務請求者就是Web服務功能的使用者,它利用SOAP消息向Web服務提供者發送請求以獲得服務;Web服務中介者的作用是把一個Web服務請求者與合適的Web服務提供者聯繫在一起,它充當管理者的角色,一般是UDDI。這三個角色是根據邏輯關係劃分的,在實際應用中,角色之間很可能有交叉:一個Web服務既可以是Web服務提供者,也可以是Web服務請求者,或者二者兼而有之。顯示了Web服務角色之間的關係:其中,“發佈”是爲了讓用戶或其他服務知道某個Web服務的存在和相關信息;“查找(發現)”是爲了找到合適的Web服務;“綁定”則是在提供者與請求者之間建立某種聯繫。

 

圖2-1 Web service的體系結構

實現一個完整的Web服務包括以下步驟:

◆ Web服務提供者設計實現Web服務,並將調試正確後的Web服務通過Web服務中介者發佈,並在UDDI註冊中心註冊; (發佈)

◆ Web服務請求者向Web服務中介者請求特定的服務,中介者根據請求查詢UDDI註冊中心,爲請求者尋找滿足請求的服務; (發現)

◆ Web服務中介者向Web服務請求者返回滿足條件的Web服務描述信息,該描述信息用WSDL寫成,各種支持Web服務的機器都能閱讀;(發現)

◆ 利用從Web服務中介者返回的描述信息生成相應的SOAP消息,發送給Web服務提供者,以實現Web服務的調用;(綁定)

◆ Web服務提供者按SOAP消息執行相應的Web服務,並將服務結果返回給Web服務請求者。(綁定)

(2)在rest風格中,使用標準的 HTTP 方法 (GET/PUT/POST/DELETE) 來抽象所有 Web 系統的服務

GET: 對於到數據庫操作的查詢,安全的

PUT: 對於到數據庫操作的更新,冪等的

POST: 對於到數據庫操作的插入,不安全不冪等

DELETE:對於到數據庫操作的刪除,冪等的

安全性是指訪問資源的時候資源本身不會發生改變,也就是資源是安全的

冪等性是一個數學概念,數學上的解釋爲f(x) = f(f(x)),對同一個資源進行一次或者多次操作,最終資源的狀態都是一樣的

(3)http的狀態是指狀態碼嗎?

1xx(臨時響應):表示臨時響應並需要請求者繼續執行操作的狀態碼。

2xx (成功):表示成功處理了請求的狀態碼。如200,服務器已成功處理了請求

3xx (重定向):要完成請求,需要進一步操作。

4xx(請求錯誤):這些狀態碼錶示請求可能出錯,妨礙了服務器的處理。如404(未找到)服務器找不到請求的網頁

2.dubbo等SOA使用

詳見http://dubbo.io

架構

(#)

節點角色說明:

Provider: 暴露服務的服務提供方。

Consumer: 調用遠程服務的服務消費方。

Registry: 服務註冊與發現的註冊中心。

Monitor: 統計服務的調用次調和調用時間的監控中心。

Container: 服務運行容器。

調用關係說明:

0. 服務容器負責啓動,加載,運行服務提供者。

1. 服務提供者在啓動時,向註冊中心註冊自己提供的服務。

2. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。

3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。

4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。

5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

(1)連通性:

註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小

監控中心負責統計各服務調用次數,調用時間等,統計先在內存彙總後每分鐘一次發送到監控中心服務器,並以報表展示

服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網絡開銷

服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網絡開銷

註冊中心,服務提供者,服務消費者三者之間均爲長連接,監控中心除外

註冊中心通過長連接感知服務提供者的存在,服務提供者宕機,註冊中心將立即推送事件通知消費者

註冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表

註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者

(2)健狀性:

監控中心宕掉不影響使用,只是丟失部分採樣數據

數據庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務

註冊中心對等集羣,任意一臺宕掉後,將自動切換到另一臺

註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊

服務提供者無狀態,任意一臺宕掉後,不影響使用

服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復

(3)伸縮性:

註冊中心爲對等集羣,可動態增加機器部署實例,所有客戶端將自動發現新的註冊中心

服務提供者無狀態,可動態增加機器部署實例,註冊中心將推送新的服務提供者信息給消費者

(4)升級性:

當服務集羣規模進一步擴大,帶動IT治理結構進一步升級,需要實現動態部署,進行流動計算,現有分佈式服務架構不會帶來阻力:

Deployer: 自動部署服務的本地代理。

Repository: 倉庫用於存儲服務應用發佈包。

Scheduler: 調度中心基於訪問壓力自動增減服務提供者。

Admin: 統一管理控制檯。

 

--Spring & SpringMVC

1.Spring AOP的實現原理,主要從Proxy和Cglib分析,以及應用場景  (內、外)

Spring AOP底層用的原理是動態代理,動態代理的實質是java的反射機制

Spring AOP使用動態代理技術在運行期織入增強代碼,一種是基於JDK的動態代理,一種是基於CGLib的動態代理,JDK本身只提供接口的代理,而不支持類的代理。

    1)JDK的動態代理裏兩個重要的:Proxy類和InvocationHandler接口

     InvocationHandler裏的invoke方法,一般(如代理類或者性能監控代碼)這種代碼類會去實現這個接口,通過method.invoke方法通過java的反射機制間接調用目標對象的方法。

      Object invoke(Object proxy, Method method, Object[] args) throwsThrowable

         proxy:  指代我們所代理的那個真實對象
         method:  指代的是我們所要調用真實對象的某個方法的Method對象
         args:  指代的是調用真實對象某個方法時接受的參數

Proxy中的newProxyInstance(ClassLoaderloader, Class<?>[] interfaces, InvocationHandler h)

     loader: 一般是被代理的目標類

     interfaces: 被代理的目標類的一些接口

     h:代理類

2)CGLib填補了JDK動態代理的空缺,採用非常底層的字節碼技術,可以爲一個類創建子類,並在子類中採用方法攔截的技術攔截所有父類方法的調用,並順勢織入橫切邏輯。其中比較重要的幾個類Enhancer,MethodProxy,MethodInterceptor

   Enhancer可以用來創建一個動態代理對象

   MethodInterceptor裏的intercept(Object paramObject, Method paramMethod, Object[]paramArrayOfObject, MethodProxy paramMethodProxy)方法,它攔截所有目標類方法的調用

   MethodProxy裏的invokeSuper方法,去動態的調用被代理類的方法。

 

3.FactoryBean和BeanFactory區別,服務器中間件啓動時如何通過Spring管理進行方法初始化加載 (內)

 (1)BeanFactory

      BeanFactory是IOC最基本的容器,負責生產和管理bean,它爲其他具體的IOC容器提供了最基本的規範,例如DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具體的容器都是實現了BeanFactory,再在其基礎之上附加了其他的功能。

(2)FactoryBean

     FactoryBean是一個接口,當在IOC容器中的Bean實現了FactoryBean後,通過getBean(StringBeanName)獲取到的Bean對象並不是FactoryBean的實現類對象,而是這個實現類中的getObject()方法返回的對象。要想獲取FactoryBean的實現類,就要getBean(&BeanName),在BeanName之前加上&。

 BeanFactory和FactoryBean其實沒有什麼比較性的,只是兩者的名稱特別接近,所以有時候會拿出來比較一番,BeanFactory是提供了IOC容器最基本的形式,給具體的IOC容器的實現提供了規範,FactoryBean可以說爲IOC容器中Bean的實現提供了更加靈活的方式,FactoryBean在IOC容器的基礎上給Bean的實現加上了一個簡單工廠模式和裝飾模式,我們可以在getObject()方法中靈活配置。

(3)spring承載的web應用 IOC容器初始化過程

1)web容器初始化的過程 
·Instantiate an instance of each eventlistener identified by a element in the deployment descriptor.

·For instantiated listener instances that implementServletContextListener, call the contextInitialized() method.

·Instantiate an instance of each filter identified by a element inthe deployment descriptor and call each filter instance’s init() method.

·Instantiate an instance of each servlet identified by a element thatincludes a element in the order defined by the load-on-startup element values,and call each servlet instance’s init() method. 
通俗一點講就是: listener—>filter—>servlet

         2)IOC容器的初始化過程 

對於spring承載的Web應用而言,可以指定在Web應用程序啓動時載入IOC容器,即WebApplicationContext,這個功能是有ContextLoaderListener來實現的,它是Web容器配置的監聽器。

  • ContextLoaderListener實際上是代理ContextLoader的,這裏用到了代理模式,所以真正啓動載入IOC容器的工作是由ContextLoader來完成的
  • ContextLoaderListener是實現了ServletContextListener接口的
  • ServletContextListener接口是ServletContext的監聽者,如果ServletContext發生變化,就會觸發相應的事件,ServletContextListener是一直在對這些事件進行監聽的,如果接收到了監聽的事件,就會做出預先設計好的響應動作,如: 
    • 服務器啓動的時候,ServletContext被創建,ServletContextListener接口的contextInitialized()會被調用
    • 服務器關閉時,ServletContext被銷燬,ServletContextListener接口的contextDestroyed()會被調用

·        ContextLoaderListener它是實現了ServletContextListener接口的,當服務啓動的時候,默認執行contextInitialized()方法,初始化WebApplicationContext

·        在初始化WebApplicationContext過程中,配置並且實例化整個Spring Application Context中的Bean,見initWebApplicationContext()方法中的configureAndRefreshWebApplicationContext()

    • 先是通過讀取context-param中的contextConfigLocation配置,然後讀取相應的配置文件
    • 通過refresh方法,實例化配置文件中的Bean

詳見:http://www.cnblogs.com/RunForLove/p/5688731.html

--事務

1.事務的傳播級別和隔離級別(內、外)

事務的幾種傳播特性
1. PROPAGATION_REQUIRED: 如果存在一個事務,則支持當前事務。如果沒有事務則開啓
2. PROPAGATION_SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行
3. PROPAGATION_MANDATORY: 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
5. PROPAGATION_NOT_SUPPORTED: 總是非事務地執行,並掛起任何存在的事務。
6. PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則拋出異常
7. PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED屬性執行

 

Spring事務的隔離級別
1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據避免髒讀、會產生不重複讀、會產生幻讀
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。避免髒讀、避免不重複讀、會產生幻讀

5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。 

髒讀: 指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。因爲這個數據是還沒有提交的數據,那麼另外一 個事務讀到的這個數據是髒數據,依據髒數據所做的操作可能是不正確的。

不可重複讀: 指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱爲是不可重複讀。

幻覺讀: 指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。

 

--web

1.統一的全局的字符編碼如何設置 (內、外)

在web.xml裏面使用spring的過濾器,處理中文亂碼問題

<filter>

                   <filter-name>encodingFilter</filter-name>

                   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

                   <init-param>

                            <param-name>encoding</param-name>

                            <param-value>UTF-8</param-value>

                   </init-param>

                   <init-param>

                            <param-name>forceEncoding</param-name>

                            <param-value>true</param-value>

                   </init-param>

         </filter>

        

         <filter-mapping>

                   <filter-name>encodingFilter</filter-name>

                   <url-pattern>/*</url-pattern>

         </filter-mapping>

--JVM

1.Java虛擬機運行時內存分配和內存釋放 (內)

一個很大的話題,具體可以看一下這個http://hllvm.group.iteye.com/group/wiki/2859-JVM  

 

--整體例外 任選1

1.百度查詢框中,假設打一個“中”字,那麼輸入框中會出現一系列提示字符串,從你角度看這是如何實現的

2.現在要求設計一個類似的word一樣的工具,但要求可以遠程多人對同一個文檔進行操作(編輯、刪除)等,同時要求一個人修改,其他人能立刻看到

,並且可以動態添加人員進入,需要保證數據的唯一性、一致性和高效性,不要出現鎖住的情況,請問你如何設計

 

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