Java面試題總結

Java基礎:html

一、JAVA中能建立volatile數組嗎?volatile能使得一個非原子操做變成原子操做嗎?前端


回答: 能,Java 中能夠建立 volatile 類型數組,不過只是一個指向數組的引用,而不是整個數組。
Java 中讀取 long 類型變量不是原子的,須要分紅兩步,若是一個線程正在修改該 long 變量的值,另外一個線程可能只能看到該值的一半(前 32 位)。可是volatile 型的 long 或 double 變量的讀寫是原子。

二、10個線程和2個線程的同步代碼,哪一個更容易寫?
回答:從寫代碼的角度來講,二者的複雜度是相同的,由於同步代碼與線程數量是相互獨立的。可是同步策略的選擇依賴於線程的數量,由於越多的線程意味着更大的競爭,因此你須要利用同步技術,如鎖分離,這要求更復雜的代碼和專業知識。
三、什麼是線程局部變量?
回答: 對於多線程資源共享的問題,同步機制採用了「以時間換空間」的方式,而ThreadLocal採用了「以空間換時間」的方式。前者僅提供一份變量,讓不一樣的線程排隊訪問,然後者爲每個線程都提供了一份變量,所以能夠同時訪問而互不影響。

四、咱們本身寫一個容器類,而後使用for-each循環嗎?
回答:能夠,你能夠寫一個本身的容器類。若是你想使用 Java 中加強的循環來遍歷,你只須要實現 Iterable接口。若是你實現 Collection 接口,默認就具備該屬性。


五、說出5條IO的最佳實踐?
回答:1.使用有緩衝區的 IO 類,而不要單獨讀取字節或字符。
2.使用 NIO 和 NIO2
3.在 finally 塊中關閉流,或者使用 try-with-resource 語句。
4.使用內存映射文件獲取更快的 IO。
5.使用非阻塞式而不要使用阻塞式的IO

六、說出至少5點在Java中使用線程的最佳實踐?
回答:1.對線程命名

2.將線程和任務分離,使用線程池執行器來執行 Runnable 或 Callable。

3.使用線程池

4.若是能夠,更偏向於使用 volatile 而不是 synchronized。

5.優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。

七、我能在不進行強制轉換的狀況下將一個double值賦值給long類型的變量嗎?
回答:不行,由於 double 類型的範圍比 long 類型更廣,因此必需要進行強制轉換。

八、咱們能在Switch中使用String嗎?
回答:在jdk 7 以前,switch 只能支持 byte、short、char、int 這幾個基本數據類型和其對應的封裝類型。switch後面的括號裏面只能放int類型的值,但因爲byte,short,char類型,它們會 自動 轉換爲int類型(精精度小的向大的轉化),因此它們也支持。
jdk1.7後,整形,枚舉類型,boolean,字符串均可以。
jdk1.7並無新的指令來處理switch string,而是經過調用switch中string.hashCode,將string轉換爲int從而進行判斷。

九、poll()方法和remove()方法的區別?
回答: poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗的時候會返回空,可是 remove() 失敗的時候會拋出異常。

十、LinkedList和ArrayList的區別?
回答:1.ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是前者是數組隊列,至關於動態數組;後者爲雙向鏈表結構,也可看成堆棧、隊列、雙端隊列對List接口的實現。

2.當隨機訪問List時(get和set操做),ArrayList比LinkedList的效率更高,由於LinkedList是線性的數據存儲方式,因此須要移動指針從前日後依次查找。

3.當對數據進行增長和刪除的操做時(add和remove操做),LinkedList比ArrayList的效率更高,由於ArrayList是數組,因此在其中進行增刪操做時,會對操做點以後全部數據的下標索引形成影響,須要進行數據的移動。

4.從利用效率來看,ArrayList自由性較低,由於它須要手動的設置固定大小的容量,可是它的使用比較方便,只須要建立,而後添加數據,經過調用下標進行使用;而LinkedList自由性較高,可以動態的隨數據量的變化而變化,可是它不便於使用。

5.ArrayList主要控件開銷在於須要在lList列表預留必定空間;而LinkList主要控件開銷在於須要存儲結點信息以及結點指針信息。

十一、hashmap的擴容問題new hashmap(19)它的長度是多少?
回答:初始長度是19,當達到默認加載因子的時候會進行擴容
十二、hashtable爲何是線程安全的?
回答:Hashtable是線程安全的,其實現方式是在對應的方法上加上synchronized關鍵字,效率不高,不建議使用。目前,若是要使用線程安全的哈希表的話,推薦使用ConcurrentHashMap。

1三、java異常處理怎麼作?
回答:1.對代碼塊用try..catch進行異常捕獲處理;

2.在 該代碼的方法體外用throws進行拋出聲明,告知此方法的調用者這段代碼可能會出現這些異常,你須要謹慎處理。此時有兩種狀況:1)若是聲明拋出的異常是非運行時異常,此方法的調用者必須顯示地用try..catch塊進行捕獲或者繼續向上層拋出異常;2)若是聲明拋出的異常是運行時異常,此方法的調用者能夠選擇地進行異常捕獲處理。

3.在代碼塊用throw手動拋出一個異常對象,此時也有兩種狀況,跟2中的相似:1)若是拋出的異常對象是非運行時異常,此方法的調用者必須顯示地用try..catch塊進行捕獲或者繼續向上層拋出異常;2)若是拋出的異常對象是運行時異常,此方法的調用者能夠選擇地進行異常捕獲處理。

1四、異常處理的做用是什麼?
回答: 由於你不可能保證程序不出錯,因此使用異常處理來防止程序出錯的時候你無從下手的局面,對於調試程序和項目實際開發都是有用的

1五、jvm內存的分配?
回答:1.程序計數器:線程私有,當前線程執行的字節碼的行號指示器。

2.虛擬機棧:線程私有,存放基本數據類型、對象引用和returnAddress類型。
3.本地方法棧:爲虛擬機使用到的Native方法服務。
4.Java堆:線程共享,存放對象的實例,也是GC回收器管理的主要區域。
5.方法區:線程共享,存放已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。 
6.運行時常量池:方法區的一部分,存放編譯期生成的各類字面量和符號引用。
7.直接內存:不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,容易引發OOM異常,NIO會調用,不受Java堆大小的限制。

1六、Abstract和interface區別?
回答:1.abstract class 在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。可是,一個類卻能夠實現多個interface。
2.在abstract class 中能夠有本身的數據成員,也能夠有非abstarct的成員方法,而在interface中,只可以有靜態的不能被修改的數據成員(也就是必須是static final的,不過在 interface中通常不定義數據成員),全部的成員方法都是abstract的。
3.abstract class和interface所反映出的設計理念不一樣。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。
4.實現抽象類和接口的類必須實現其中的全部方法。抽象類中能夠有非抽象方法。接口中則不能有實現方法。
5.接口中定義的變量默認是public static final 型,且必須給其初值,因此實現類中不能從新定義,也不能改變其值。
6.抽象類中的變量默認是 friendly 型,其值能夠在子類中從新定義,也能夠從新賦值。
7.接口中的方法默認都是 public,abstract 類型的。

1七、有沒有遇到過內存溢出,內存溢出怎麼解決?
回答: 分不一樣狀況解決,大多數狀況下,此時若是代碼沒有問題的狀況下,適當調整-Xmx和-Xms是能夠避免的,不過必定是代碼沒有問題的前提,爲何會溢出呢,要麼代碼有問題,要麼訪問量太多而且每一個訪問的時間太長或者數據太多,致使數據釋放不掉,由於垃圾回收器是要找到那些是垃圾才能回收,這裏它不會認爲這些東西是垃圾,天然不會去回收了。

1八、jvm調優有哪幾種方式
回答:1.觀察內存釋放狀況、集合類檢查、對象樹
2.線程監控
3.內存泄漏檢查
4.具體調優方式:

1九、java中invokeAndWait和invokeLater有什麼區別?
回答: 這兩個方法是Swing API 提供給Java開發者用來從當前線程而不是事件派發線程更新GUI組件用的。InvokeAndWait()同步更新GUI組件,好比一個進度條,一旦進度更新了,進度條也要作出相應改變。若是進度被多個線程跟蹤,那麼就調用invokeAndWait()方法請求事件派發線程對組件進行相應更新。而invokeLater()方法是異步調用更新組件的。

20、Swing API中哪些方法是線程安全的?
回答:Swing的規則是:一旦Swing組件被具現化(realized),全部可能影響或依賴於組件狀態的代碼都應該在事件派發線程中執行。因此有這3個線程安全的方法:repaint(),revalidate(),andinvalidate()。

2一、如何在Java中建立immutable對象?
回答: 1.immutable對象的狀態在建立以後就不能發生改變,任何對它的改變都應該產生一個新的對象。
2.Immutable類的全部的屬性都應該是final的。
3.對象必須被正確的建立,好比:對象引用在對象建立過程當中不能泄露(leak)。
4.對象應該是final的,以此來限制子類繼承父類,以免子類改變了父類的immutable特性。
5.若是類中包含mutable類對象,那麼返回給客戶端的時候,返回該對象的一個拷貝,而不是該對象自己(該條能夠歸爲第一條中的一個特例)

2二、Java中的readwritelock是什麼?
回答: 通常而言,讀寫鎖是用來提高併發程序性能的鎖分離技術的成果。Java中的ReadWriteLock是Java 5 中新增的一個接口,一個ReadWriteLock維護一對關聯的鎖,一個用於只讀操做一個用於寫。在沒有寫線程的狀況下一個讀鎖可能會同時被多個讀線程 持有。寫鎖是獨佔的,你能夠使用JDK中的ReentrantReadWriteLock來實現這個規則,它最多支持65535個寫鎖和65535個讀 鎖。

2三、多線程中的忙循環是什麼?
回答: 忙循環就是程序員用循環讓一個線程等待,不像傳統方法wait(), sleep() 或 yield() 它們都放棄了CPU控制,而忙循環不會放棄CPU,它就是在運行一個空循環。這麼作的目的是爲了保留CPU緩存,在多核系統中,一個等待線程醒來的時候可能會在另外一個內核運行,這樣會重建緩存。爲了不重建緩存和減小等待重建的時間就能夠使用它了。 

2四、volatile變量和atomic變量有什麼不一樣?
回答:volatile 變量和 atomic 變量看起來很像,但功能卻不同。Volatile變量能夠確保先行關係,即寫操做會發生在後續的讀操做以前, 但它並不能保證原子性。例如用volatile修飾count變量那麼 count++ 操做就不是原子性的。而AtomicInteger類提供的atomic方法可讓這種操做具備原子性如getAndIncrement()方法會原子性的進行增量操做把當前值加一,其它數據類型和引用變量也能夠進行類似操做。

2五、若是同步塊內的線程拋出異常會發生什麼?
回答: 這個問題坑了不少Java程序員,若你能想到鎖是否釋放這條線索來回答還有點但願答對。不管你的同步塊是正常仍是異常退出的,裏面的線程都會釋放鎖,因此對比鎖接口我更喜歡同步塊,由於它不用我花費精力去釋放鎖,該功能能夠在finally block裏釋放鎖實現。 

2六、單例模式的雙檢鎖式是什麼?
回答: 雙重檢驗鎖模式(double checked locking pattern),是一種使用同步塊加鎖的方法。程序員稱其爲雙重檢查鎖,由於會有兩次檢查 instance == null,一次是在同步塊外,一次是在同步塊內。爲何在同步塊內還要再檢驗一次?由於可能會有多個線程一塊兒進入同步塊外的 if,若是在同步塊內不進行二次檢驗的話就會生成多個實例了。

2七、如何在Java中建立線程安全的singleton?
回答:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}


2八、說說jdk1.8的新特性?
回答:1.隨着大數據的興起,函數式編程在處理大數據上的優點開始體現,引入了Lambada函數式編程
2.使用Stream完全改變了集合使用方式:只關注結果,不關心過程
3.新的客戶端圖形化工具界面庫:JavaFX
4.良好設計的日期/時間API
5.加強的併發/並行API
6.Java與JS交互引擎 -nashorn
7.其餘特性

2九、gc回收機制原理?
回答:用戶Java程序運行過程當中,Java虛擬機提供了另一個系統級的線程,專門負責回收再也不被使用的對象佔用的內存,這一過程稱爲垃圾回收。垃圾回收須要對堆內存中的對象進行標記,並對堆內存進行整理。這一過程的某些階段須要暫時終止用戶Java線程,等回收工做完成後再恢復執行。所以,頻繁地觸發虛擬機垃圾回收操做的行爲會影響程序的運行效率。那麼什麼狀況下會頻繁地出發垃圾回收操做呢?- 好比:堆內存設置太小- 再好比:程序頻繁地分配大型局部對象數組。java

 

javaweb:node

一、tomcat的優化方式?
回答:
Tomcat的優化我準備從三方面來講:

第一部分: 內存優化
Tomcat的默認內存配置比較低,不用說大項目,就算是小項目,併發量達到必定程度也就可能會拋出OutOfMemoryError異常,
爲了解決這個問題,咱們要修改JVM的一些配置,在tomcat的bin目錄下的catalina配置文件中,配置Xms和Xmx,也就是
Java虛擬機初始化時堆的最小內存和最大內存,這倆值一般會配置成同樣,這樣GC沒必要再爲擴展內存空間而消耗性能.
除了這兩個,還能夠配置XX:PermSize和XX:MaxPermSize,它們是Java虛擬機永久代大小和最大值,除了這幾個參數
還能夠再根據具體須要配置其餘參數。

第二部分: 配置優化
配置優化,主要有三方面:
1. Connector 優化
Connector是鏈接器,它負責接收客戶的請求,以及向客戶端回送響應的消息。
默認狀況下Tomcat只支持200線程訪問,超過這個數量的鏈接將被等待甚至超時放棄,因此咱們須要提升這方面的處理能力.
修改這部分配置須要修改conf下的server.xml,找到Connector 標籤項,修改protocol,默認的協議類型是BIO,也就是阻塞式I/O操做,
簡單項目及應用能夠採用BIO.

第二種協議類型是NIO,它就是一種基於緩衝區是、並能提供非阻塞I/O操做的java API,它有更好的併發運行性能. NIO更適合後臺須要耗時完成請求的操做

第三種協議類型是APR,它主要能夠提升Tomcat對靜態文件的處理性能.
選擇哪一個協議也是根據實際項目進行配置.

除了這個協議類型,還有一個很是重要的參數要改,就是maxThreads,就是當前鏈接器可以處理同時請求的最大數目.這個數目也並不是
越大越好,它也受操做系統等硬件制約,因此這個值要根據壓力測試後實際數據進行配置.

2. 線程池
使用線程池的好處在於減小了建立銷燬線程的相關消耗,並且能夠提升線程的使用效率。使用線程池就在Service標籤中配置Executor就能夠了

3. Listener
還有一個影響tomcat性能的因素是內存泄漏,咱們在Server標籤中配置一個JreMemoryLeakPreventionListener就能夠用來預防JRE內存泄漏

第三部分: 組件優化
能夠選用Tomcat Native組件,它可讓 Tomcat使用 Apache 的 APR包來處理包括文件和網絡IO操做,從而提高性能及兼容性


二、http協議有哪些部分組成?
回答:1.請求部分:1)請求行:請求方式 路徑 協議及版本 2)請求頭:請求頭中保存的是本地瀏覽器信息的,是發送到服務器,被服務器解析的 3)請求體:請求體中存儲的是請求數據,請求方式是POST時,請求體中才有內容;

2.響應部分:1)響應行:協議及版本 狀態碼 狀態碼描述 2)響應頭:包含了服務器信息以及響應內容信息,被瀏覽器解析的 3)響應體:存儲響應數據,給通常用戶看的
三、Get和Post的區別?
回答:Get請求方式:地址欄裏會顯示咱們提交的數據(不安全),而且地址欄中支持提交少許數據,請求的數據存在請求行中;
Post請求方式:地址欄裏不顯示咱們提交的數據信息(相對安全),能夠提交大量數據,請求的數據存在請求正文中。

四、cookie和session的區別?
回答:共同點:cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式;

區別:cookie數據保存在客戶端,保存數據不安全且存儲數據量有限;session數據保存在服務器端,保存數據安全且存儲數據量大,session是基於cookie進行信息處理的;

五、什麼是ajax,爲何要使用ajax?
回答:Ajax是一種建立交互式網頁應用的網頁開發技術;Asynchronous JavaScript and XML的縮寫;

Ajax的優點:1.經過異步模式,提高了用戶體驗;

2.優化了瀏覽器和服務器之間的傳輸,減小沒必要要的數據往返,減小了寬帶佔用;

3.Ajax引擎在客戶端運行,承擔了一部分原本由服務器承擔的工做,從而減小了大用戶量下的服務器負載;

Ajax的最大特色:能夠實現局部刷新,在不更新整個頁面的前提下維護數據,提高用戶體驗度。

注意:ajax在實際項目開發中使用率很是高(牢固掌握)。
六、淺談你對ajax的認識?
回答:同上(第5個問題)

七、Cookie和Session以及Servlet的生命週期?
回答:1.Cookie的生命週期是累計的,從建立時,就開始計時,20分鐘後,cookie生命週期結束。

2. Session的生命週期是間隔的,從建立時,開始計時如在20分鐘,沒有訪問session,那麼session生命週期被銷燬;可是,若是在20分鐘內(如在第19分鐘時)訪問過session,那麼將從新計算session的生命週期。注意:關機會形成session生命週期的結束,可是對cookie沒有影響。

3.init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。能夠配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。不管有多少客戶機訪問Servlet,都不會重複執行init()。

service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,並且傳遞給這個方法一個」請求」(ServletRequest)對象和一個」響應」(ServletResponse)對象做爲參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

destroy():僅執行一次,在服務器端中止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資源。一個Servlet在運行service()方法時可能會產生其餘的線程,所以須要確認在調用destroy()方法時,這些線程已經終止或完成。

八、說一下你熟悉的經常使用linux命令?
回答:1.列出文件列表:ls

2.建立目錄和移除目錄:mkdir rmdir

3.用於顯示文件後幾行內容:tail

4.打包:tar -xvf

5.打包並壓縮:tar -zcvf

6.查找字符串:grep

7.顯示當前所在目錄:pwd

8.建立空文件:touch

9:編輯器:vim vi

九、後臺傳過的json數據前臺怎麼接收?
回答:在前臺能夠使用js代碼接收,也能夠經過ajax接收,也有專門的前端框架接收

十、後臺傳過來一個集合前臺怎麼接收?
回答:使用el表達式或者ognl表達式,或者根據實際狀況從域中取數據
mysql

 

數據庫:linux

一、MySQL的delete與truncate區別?git

回答:delete語句執行刪除的過程是每次從表中刪除一行,而且同時將該行的刪除操做做爲事務記錄在日誌中保存以便進行回滾操做,不清空AUTO_INCREMENT記錄數;程序員

truncate則直接將表刪除並從新建表,不會把單獨的刪除操做記錄記入日誌保存,刪除行是不能恢復的,AUTO_INCREMENT將置爲0,效率比delete高。web

二、MySQL的存儲過程是什麼?
回答:存儲過程是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它;
建立存儲過程:」pr_add」是個簡單的MySQL存儲過程,這個MySQL存儲過程有兩個int類型的輸入參數」a」,」b」,返回這兩個參數的和。

1)drop procedure if exists pr_add;

2)計算兩個數之和

create procedure pr_add( a int , b int )begin declare c int;

if a is null then set a = 0;

end if;

if a is null then set b = 0;

end if;
set c = a+b;
select c as sum ; 

三、談談你對索引的理解?
回答:索引是對數據庫中一對多個列值的排序,幫助數據庫高效獲取數據的數據結構。假如咱們用類比的方法,數據庫中的索引就至關於書籍中的目錄同樣,當咱們想找到書中的某個知識點,咱們能夠直接去目錄中找而不是在書中每頁的找,可是這也拋出了索引的一個缺點,在對數據庫修改的時候要修改索引,致使時間變多。
索引分爲:普通索引,惟一索引,主鍵索引,全文索引

優勢:加快檢索速度;惟一索引確保每行數據的惟一性;在使用索引的過程能夠優化隱藏器,提升系統性能

缺點:插入刪除,修改,維護速度降低;佔用物理和數據空間;

四、簡單描述一下數據庫的事務?
回答:應用的場景:存在併發數據訪問時才須要事務
ACID四大特性:a)原子性:整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間的某個環節。任何一項操做的失敗都會致使整個事務的失敗;

b)一致性:在事務開始以前和事務結束以後,數據庫的完整性約束沒有被破壞;

c)隔離性:併發執行的事務彼此沒法看到對方的中間狀態;

d)持久性:在事務完成之後,該事務所對數據庫所操做的更改便持久的保存在數據庫之中,並不會被回滾。

問題:a)髒讀:一個事務讀取到另外一個事務未提交的數據

b)不可重複讀:一個事務中兩次查詢的數據不一致 -->一個事務讀到了另外一個事務,已經提交數據(update 操做)

c)虛讀(幻讀):一個事務中兩次查詢的數據不一致 -->一個事務讀到了另外一個事務,已經提交數據(insert 操做)
隔離級別:安全從低到高,性能從高到低;

a)讀未提交:也叫髒讀,是事務能夠讀取其餘事務未提交的數據。—>未解決任何問題

b)讀已提交:在事務未提交以前所作的修改其它事務是不可見的。—>解決髒讀問題

c)可重複讀:保證同一個事務中的屢次相同的查詢的結果是一致的。—>解決髒讀,不可重複讀的問題

d)可串行化:保證讀取的範圍內沒有新的數據插入,好比事務第一次查詢獲得某個範圍的數據,第二次查詢也一樣獲得了相同範圍的數據,中間沒有新的數據插入到該範圍中。—>解決髒讀,不可重複讀,虛讀(幻讀)問題。ajax


經常使用數據庫默認隔離級別:

MySQL:可重複讀;Oracle:讀已提交;SQLServe:讀已提交。r

五、Oracle是怎麼樣分頁的?
回答:Oracle中使用rownum來進行分頁,這個是效率最好的分頁方法,hibernate也是使用rownum來進行Oracle分頁的;
select * from

(select round r,a from tabName where round <= 20)

where r > 10 

六、說說Oracle中常用到得函數?
回答:Length長度 、lower 小寫、upper 大寫、to_date 轉化日期、to_char 轉化字符,Ltrim 去左邊空格、substr 取字符串、add_month 增長或者減掉月份、to_number 轉變爲數字
七、談談你對Oracle高水位的理解?
回答:全部的oracle段(segments,在此,爲了理解方便,建議把segment做爲表的一個同義詞) 都有一個在段內容納數據的上限,咱們把這個上限稱爲"high water mark"或HWM。這個HWM是一個標記,用來講明已經有多少沒有使用的數據塊分配給這個segment。HWM一般增加的幅度爲一次5個數據塊,原則上HWM只會增大,不會縮小,即便將表中的數據所有刪除,HWM仍是爲原值,因爲這個特色,使HWM很象一個水庫的歷史最高水位,這也就是HWM的原始含義,固然不能說一個水庫沒水了,就說該水庫的歷史最高水位爲0。可是若是咱們在表上使用了truncate命令,則該表的HWM會被從新置爲0。
八、MySQL、Oracle、SqlServer三者之間的區別?
回答:
1. mysql
使用風險:SQL server 徹底重寫代碼經歷了長期測試,須要時間來證實並十分兼容;
優勢:
體積小、速度快、整體擁有成本低,開源;支持多種操做系統;是開源數據庫,提供的接口支持多種語言鏈接操做。

缺點:
不支持熱備份;
MySQL最大的缺點是其安全系統,主要是複雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變;
沒有一種存儲過程(Stored Procedure)語言,這是對習慣於企業級數據庫的程序員的最大限制;
MySQL的價格隨平臺和安裝方式變化。Linux的MySQL若是由用戶本身或系統管理員而不是第三方安裝則是免費的,第三方案則必須付許可費。Unix或Linux 自行安裝 免費 、Unix或Linux 第三方安裝 收費;
2. oracle
優勢:
開放性:Oracle 能在全部主流平臺上運行(包括 windows)徹底支持全部工業標準, 採用徹底開放策略,使客戶選擇適合解決方案;
可伸縮性,並行性:Oracle 並行服務器經過使組結點共享同簇工做來擴展windownt能 力,提供高用性和高伸縮性簇解決方案。
安全性:得到最高認證級別的ISO標準認證。 
性能:Oracle 性能高 保持開放平臺下TPC-D和TPC-C世界記錄;
客戶端支持及應用模式:Oracle 多層次網絡計算支持多種工業標準用ODBC、JDBC、OCI 等網絡客戶鏈接 
使用風險:Oracle 長時間開發經驗徹底向下兼容得普遍應用地風險低 。
缺點:
對硬件的要求很高;
價格比較昂貴;
管理維護麻煩一些;
操做比較複雜,須要技術含量較高;
3. sqlserver
優勢:
易用性、適合分佈式組織的可伸縮性、用於決策支持的數據倉庫功能、與許多其餘服 器軟件緊密關聯的集成性、良好的性價比等;
SQLServer是一個具有徹底Web支持的數據庫產品,提供了對可擴展標記語言 (XML) 的核心支持以及在Internet上和防火牆外進行查詢的能力;
缺點:SQL Server 只能windows上運行,沒有絲毫開放性操做系統。
伸縮性並行性 :數據卷伸縮性有限;
安全性:沒有得到任何安全證書。
性能 :SQL Server 多用戶時性能佳 ;
客戶端支持及應用模式: 客戶端支持及應用模式。只支持C/S模式,SQL Server C/S 結構只支持windows客戶用ADO、DAO、OLEDB、ODBC鏈接;

九、數據庫語句優化有哪些?


回答:一、對查詢進行優化,應儘可能避免全表掃描,首先應考慮在where 及 order by 涉及的列上創建索引。
二、應儘可能避免在where 字句中對字段進行null 值判斷,不然將致使引擎放棄使用索引二進行全表掃描。

三、應儘可能避免在where 字句中使用or 來鏈接條件,不然將致使引擎放棄使用索引二進行全表掃描。

四、應儘可能避免在where字句中使用!=或<>操做符,不然引擎將放棄使用索引二進行全表掃描。

五、in 和 not in 也要慎用,不然會致使全表掃描。

六、索引並非越多越好,索引當然能夠提升相應的select 的效率,但同時也下降了 insert 及 update 的效率,由於insert 或update時有可能會重建索引,因此怎樣建索引須要慎重考慮,視具體狀況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不經常使用到的列上建的索引是否有必要。

七、查詢結果不要用 * 來查詢全部字段,要明確指明結果字段。

八、根據查詢條件,簡歷索引,若是查詢條件不止一個時,使用組合索引。

九、在查詢條件表達式的左側儘可能不要使用函數,不然索引失效。

十、若是有like話,儘可能避免%xxx%兩側都有%的條件,單側%能夠使用索引,多側不能夠。

十一、創建索引時字段不能有null值


十、MySQL數據庫優化有哪些?

回答:1. EXPLAIN 你的 SELECT 查詢;2. 當只要一行數據時使用 LIMIT 1;3. 使用 ENUM 而不是 VARCHAR;4. 固定長度的表會更快;5. 分庫分表


十一、Oracle數據庫優化有哪些?


回答:一、調整數據結構的設計。二、調整操做系統參數。三、調整應用程序結構設計。四、調整數據庫SQL語句。五、調整服務器內存分配。六、調整硬盤I/O。

 

框架:

一、談談對spring框架的瞭解 ,spring有什麼做用(IOC,AOP),spring的核心是什麼?
回答:Spring是一個開源框架,它是爲了解決企業應用開發的複雜性而建立的。框架的主要優點之一就是其分層架構,分層架構容許使用者選擇使用哪個組件,同時爲 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成之前只可能由EJB完成的事情。然而,Spring的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用均可以從Spring中受益。簡單來講,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
Spring的核心是控制反轉(IoC)和麪向切面(AOP)。

  Spring的做用:1)方便解耦,簡化開發:經過Spring提供的IOC容器,咱們能夠將對象之間的依賴關係交由Spring進行控制,避免編碼所形成的過分程序耦合。有了Spring,用戶沒必要再爲單例模式類、屬性文件解析等這些不少底層的需求編寫代碼,能夠更專一於上層的應用。
2)AOP編程的支持:經過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能能夠經過AOP輕鬆應付。

3)聲明式事務的支持:在Spring中,咱們能夠從單調煩悶的事務管理代碼中解脫出來,經過聲明式方式靈活地進行事務的管理,提供開發效率和質量。

4)方便程序的測試:能夠用非容器依賴的編程方式進行幾乎全部的測試工做,在Spring裏,測試再也不是昂貴的操做,而是隨手可作的事情。例如:Spring對Junit4支持,能夠經過註解方便的測試Spring程序。

5)方便集成各類優秀框架:Spring不排斥各類優秀的開源框架,相反,Spring能夠下降各類框架的使用難度,Spring提供了對各類優秀框架的直接支持。

6)下降Java EE API的使用難度:Spring對不少難用的Java EE API 提供了一個薄薄的封裝層,經過Spring的簡易封裝,這些Java EE API的使用難度大爲下降。
注:Spring的源碼設計精巧、結構清晰、匠心獨運,到處體現着大師對Java設計模式靈活運用以及Java技術的高深造詣。Spring框架源碼無疑是Java技術的最佳實踐範例。若是想在短期內迅速提升本身的Java技術水平和應用開發水平,學習和研究Spring源碼將會使你收到意想不到的效果。




二、SpringMVC的經常使用註解,執行流程,都有哪幾種解析器,必需要返回modelAndView麼,SpringMVC接收一個json數據時怎麼處理的,用什麼註解?
回答:SpringMVC經常使用註解:1)@Controller 用於標記在一個類上,使用它標記的類就是一個SpringMVC Controller對象。
2)@RequestMapping 是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。

3)@Resource和@Autowired 二者都是作bean的注入時使用,其實@Resource並非Spring的註解,它的包是java.annotation.Resource,須要導入,可是Spring支持該註解的注入。@Autowired爲Spring提供的註解,須要導入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

4)@PathVariable 用於將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量做爲參數。

5)@Cookie 用來獲取Cookie中的值。

6)@RequestParam 用於將請求參數區數據映射到功能處理方法的參數上。

7)@SessionAttrbutes 即將值放到session做用域中,寫在class上面;除了能夠經過屬性名指定須要放到會話中的屬性外(value 屬性值),還能夠經過模型屬性的對象類型指定哪些模型屬性須要放到會話中(types 屬性值)。

8)@ModelAttribute 表明的是:該Controller的全部方法在調用前,先執行此@ModelAttribute方法,可用於註解和方法參數中,能夠把這個@ModelAttribute特性,應用在BaseController當中,全部的Controller繼承BaseController,便可實如今調用Controller時,先執行@ModelAttribute方法。
9)@ResponseBody 該註解用於將Controller的方法返回的對象,經過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區;返回數據不是html標籤的頁面,而是其餘某種格式的數據時(如son、xml等)使用。
10)@RequestBody 該用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,而後把相應的數據綁定到要返回的對象上;再把HttpMessageConverter返回的對象數據綁定到controller中方法的參數上。
SpringMVC的執行流程:



經常使用的視圖解析器:(AbstractCachingViewResolver、UrlBasedViewResolver、XmlViewResolver、BeanNameViewResolver、ResourceBundleViewResolver、FreeMarkerViewResolver、VolocityViewResolver)
必需要返回modelAndView麼,SpringMVC接收一個json數據時怎麼處理的,用什麼註解?

不是,使用@ResponseBody把後臺pojo轉換json對象,返回到頁面;@RequestBody接受前臺json,把json數據自動封裝pojo。


三、Spring 依賴注入的幾種方式?
回答:Spring經常使用的依賴注入方式是:Setter方法注入、構造器注入、Filed注入(用於註解方式);
1)Setter方法注入:首先要配置被注入的bean,在該bean對應的類中,應該有要注入的對象屬性或者基本數據類型的屬性。

2)構造器注入:在PersonBiz類中注入PersonDAO和一個String類型的數據;在該類中,不用爲PersonDAO屬性和String數據類型的屬性設置setter方法,可是須要生成該類的構造方法;在配置文件中配置該類的bean,並配置構造器,在配置構造器中用到了<constructor-arg>節點。

3)Filed注入(用於註解方式):在spring中,注入依賴對象能夠採用手工裝配或自動裝配,在實際應用開發中建議使用手工裝配,由於自動裝配會產生許多未知狀況,開發人員沒法預見最終的裝配結果。


四、Spring設置爲單例 ,那麼線程安全問題怎麼解決?
回答:首先了解一下在什麼狀況下,單例的Bean對象存在線程安全問題,當Bean對象對應的類存在可變的成員變量而且其中存在改變這個變量的線程時,多線程操做該Bean對象時會出現線程安全;產生的緣由是當多線程中存在線程改變了bean對象的可變成員變量時,其餘線程沒法訪問該bean對象的初始狀態,從而形成數據錯亂;
解決辦法:1)在Bean對象中儘可能避免定義可變的成員變量;2)在Bean對象中定義一個ThreadLocal成員變量,將須要的可變成員變量保存在ThreadLocal中。


五、 Struts2 和SpringMVC的區別 ?
回答:1)Struts2是類級別上的攔截,一個Action對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文;並且Struts2過濾後是去Struts2配置文件中Action,而SpringMVC過濾後是去Controller中找對應於@RequestMapping註解的uri綁定的方法,從這裏看Struts2使用起來更麻煩,由於你要每一個類的請求你都要配置對應的攔截器。
2)由於攔截器的緣由,致使Struts2的action比較亂,由於它要定義屬性來獲取請求中參數的數據,而屬性在一個類的方法間是共享的(方法間不能獨享request、response數據),因此會有點亂;SpringMVC方法之間基本獨立,獨享request、response之間的數據。請求數據經過參數獲取,處理結果經過model Map交回給框架(方法間不共享變量)。

3)SpringMVC集成了Ajax,使用很是方便,只須要一個註解@ResponseBody就能夠實現,而後直接返回響應文本便可,而Struts2攔截器集成了Ajax,在Action中處理時通常必須安裝插件或者本身寫代碼集成進去,使用起來也相對不方便。



六、Struts2能夠是單例的嗎 爲何?
回答:Struts2的Action是多例模式的,也就是每次請求產生一個Action的對象,可是經過spring能夠控制成單例,控制成單例的話,能夠減小內存的消耗,由於能夠保存action不被銷燬,但不保證這些數據在多線程的環境下不被相互影響。
七、什麼是有狀態對象,什麼是無狀態對象?
回答:1)有狀態對象,多線程環境下不安全,那麼適合用Prototype原型模式。Prototype: 每次對bean的請求都會建立一個新的bean實例;
2)無狀態對象(Stateless Bean),就是沒有實例變量的對象,不能保存數據,是不變類,是線程安全的。


八、Spring的經常使用註解?
回答:@Controller:標記於一個類上面;用來註解這個bean(類)是MVC模型中的一個控制層,使分發處理器識別到該類,該類會被spring的auto-scan掃到歸入管理。
@RequestMapping:標記於一個被@Controller標註的類上;標記於被@Controller標註類裏面的方法上面;表示該被標註類下面全部方法的父類標註。

@Service:用於標註業務層組件上;標註與業務層組件上表示定義一個bean,自動根據所標註的組件名稱實例化一個首字母爲小寫的bean。

@Resource:標註於字段上或者setter方法上,@Resource默認按ByName進行自動裝配;用來自動裝配Bean,激活一個命名資源的依賴注入,@Resource屬性name能夠定義被自動裝配Bean的名稱。

@Autowired:與@Resource的用法和做用基本一致;@Resource屬於J2EE,@Autowired屬於Spring;@Autowired是根據類型(ByType)進行自動裝配的;@Autowired沒有name屬性,若是要按名稱進行裝配,須要配合@Qualifier使用。

@Repository:是用戶標註數據訪問層組件(DAO層);實現DAO訪問,將類識別爲Bean,同時它將所標註的類中拋出的數據訪問異常封裝爲Spring的數據訪問異常類型。

@Component:泛指組件,當組件很差歸類的時候,咱們能夠使用這個註解進行標註;和前面@Service、@Repository、@Controller同樣,只是它們比@Component更細化。

九、報表用的什麼生成圖表?
回答:1)JFreeChart :.jfree.org/jfreechart/
2)ECharts:

3) jCharts:.sourceforge.net/

4)DynamicReports:.dynamicreports.org/

5)JChartLib:http://sourceforge.net/projects/jchartlib/

6)SWTChart:.swtchart.org/

以上JAVA經常使用的生成圖表工具。



十、Spring 是如何管理事務的?
回答:Spring的事務機制包括聲明式事務和編程式事務;編程式事務管理(Spring推薦使用TransactionTemplate,實際開發中使用聲明式事務較多);聲明式事務管理(將咱們從複雜的事務處理中解脫出來,獲取鏈接,關閉鏈接,事務提交、回滾、異常處理等這些操做都不用咱們處理了,Spring都會幫咱們處理;使用了AOP面向切面編程實現的,本質就是在目標方法執行先後進行攔截。在目標方法執行前加入或建立一個事務,在執行方法執行後,根據實際狀況選擇提交或是回滾事務。)
Spring事務管理主要包括3個接口,Spring的事務主要由它們三個共同完成的。

1)PlatformTransactionManager:事務管理器(主要用於平臺相關事務的管理),主要有三個方法(commit 事務提交;rollback 事務回滾;getTransaction 獲取事務狀態);

2)TransactionDefinition:事務定義信息(用來定義事務相關的屬性,給事務管理器PlatformTransactionManager使用),主要有四個方法(getIsolationLevel 獲取隔離級別、getPropagationBehavior 獲取傳播行爲、getTimeout 獲取超時時間、isReadOnly 是否只讀);

3)TransactionStatus:事務具體運行狀態(事務管理過程當中,每一個時間點事務的狀態信息)。

聲明式事務:優勢(不須要在業務邏輯代碼中編寫事務相關代碼,只須要在配置文件配置或使用註解(@Transaction),這種方式沒有入侵性);
缺點(聲明式事務的最細粒度做用於方法上,若是像代碼塊也有事務需求,只能變通下,將代碼塊變爲方法)。

十一、簡單說說你知道的spring的底層?
回答:1)Spring對Bean進行實例化(至關於程序中的new Xx())
2)Spring將值和Bean的引用注入進Bean對應的屬性中
3)若是Bean實現了BeanNameAware接口,Spring將Bean的ID傳遞給setBeanName()方法(實現BeanNameAware清主要是爲了經過Bean的引用來得到Bean的ID,通常業務中是不多有用到Bean的ID的)
4)若是Bean實現了BeanFactoryAware接口,Spring將調用setBeanDactory(BeanFactory bf)方法並把BeanFactory容器實例做爲參數傳入。(實現BeanFactoryAware 主要目的是爲了獲取Spring容器,如Bean經過Spring容器發佈事件等)
5)若是Bean實現了ApplicationContextAwaer接口,Spring容器將調用setApplicationContext(ApplicationContext ctx)方法,把y應用上下文做爲參數傳入.(做用與BeanFactory相似都是爲了獲取Spring容器,不一樣的是Spring容器在調用setApplicationContext方法時會把它本身做爲setApplicationContext 的參數傳入,而Spring容器在調用setBeanDactory前須要程序員本身指定(注入)setBeanDactory裏的參數BeanFactory )
6)若是Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessBeforeInitialization(預初始化)方法(做用是在Bean實例建立成功後對進行加強處理,如對Bean進行修改,增長某個功能)
7)若是Bean實現了InitializingBean接口,Spring將調用它們的afterPropertiesSet方法,做用與在配置文件中對Bean使用init-method聲明初始化的做用同樣,都是在Bean的所有屬性設置成功後執行的初始化方法。
8)若是Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessAfterInitialization(後初始化)方法(做用與6的同樣,只不過6是在Bean初始化前執行的,而這個是在Bean初始化後執行的,時機不一樣)
9)通過以上的工做後,Bean將一直駐留在應用上下文中給應用使用,直到應用上下文被銷燬
10)若是Bean實現了DispostbleBean接口,Spring將調用它的destory方法,做用與在配置文件中對Bean使用destory-method屬性的做用同樣,都是在Bean實例銷燬前執行的方法。

十二、說說solr的底層 ?
回答:1) 索引過程:(一、有一系列被索引文件;二、被索引文件通過語法分析和語言處理造成一系列詞(Term);三、通過索引建立造成詞典和反向索引表;四、經過索引存儲將索引寫入硬盤。)
2)搜索過程:(一、用戶輸入查詢語句;二、 對查詢語句通過語法分析和語言分析獲得一系列詞(Term);三、經過語法分析獲得一個查詢樹;四、經過索引存儲將索引讀入到內存;五、利用查詢樹搜索索引,從而獲得每一個詞(Term)的文檔鏈表,對文檔鏈表進行交,差,並獲得結果文檔;六、將搜索到的結果文檔對查詢的相關性進行排序;七、返回查詢結果給用戶。)
源碼實現:




1三、Solr如何搭建,簡單介紹一下,你用的什麼版本?
回答:solr-4.10.3搭建:1)下載solr-4.10.3版本,JDK須要1.7及以上版本;2)解壓solr-4.10.3;3)建立solr工程;4)部署到tomcat容器;5)新建solrCore,在此目錄下新建core2文件夾;6)查詢數據表數據;7)java經過solr查詢數據庫表。
詳細過程參考:


1四、Mybatis和hibernate的區別?
回答:mybatis:1)入門簡單,即學即用,提供數據庫查詢的自動對象綁定功能,並且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來講,至關完美;
2)能夠進行更爲細緻的SQL優化,能夠減小查詢字段;

3)缺點就是框架仍是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,可是整個底層數據庫查詢實際仍是要本身寫的,工做量也比較大,並且不太容易適應快速數據庫修改;

4)二級緩存機制不佳。

hibernate:1)功能強大,數據庫無關性好,O/R映射能力強,若是你對Hibernate至關精通,並且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會至關簡單,須要寫的代碼不多,開發速度很快,很是爽;

2)有更好的二級緩存機制,能夠使用第三方緩存;

3)缺點就是學習門檻不低,要精通門檻更高,並且怎麼設計O/R映射,在性能和對象模型之間如何取得平衡,以及怎樣用好Hibernate方面須要你的經驗和能力都很強才行。


1五、對於hibernate3,4,5有什麼瞭解,其中的特性是什麼?
回答:hibernate4中的新特性基於hibernate3中的改變:1)數據庫方言的設置(在3.3版本中鏈接MySQL數據庫只須要指明MySQLDialect便可。在4.1版本中能夠指出MySQL5Dialect)
2)buildSessionFactory(4.1版本中buildSessionFactory()已經被buildSessionFactory(ServiceRegistry ServiceRegistry)取代)
3)annotation(4.1版本中推薦使用annotation配置,因此在引進jar包時把requested裏面的包所有引進來就已經包含了annotation必須包了)
4)事務,hibernateTemplate(hibernate4已經徹底能夠實現事務了與spring3.1中的hibernatedao,hibernateTemplate等有衝突,因此spring3.1裏已經不提供hibernatedaosupport,hibernateTemplate)
5)自動建表(hibernate4.1已經能夠自動建表,因此開發時只須要本身開發類而後配置很久OK)
hibernate5的新特性:1)明確了關聯關係映射;2)明確Hibernate檢索優化;3)明確Hibernate緩存機制;4)明確Hibernate對事務併發控制的管理;5)明確Hibernate註解開發。


1六、SpringMVC的底層是基於什麼實現的?
回答:Spring MVC是基於servlet功能實現的,經過實現Servlet接口的DispatcherServlet來封裝其核心功能實現,經過將請求分派給處理程序,同時帶有可配置的處理程序映射、視圖解析、本地語言、主題解析以及上傳下載文件支持。

1七、請羅列出您所理解的微服務架構應具備的關鍵組件及關鍵指標?
回答:1)負載平衡:Linkerd提供了多種負載均衡算法,它們使用實時性能指標來分配負載並減小整個應用程序的尾部延遲。
2)熔斷:Linkerd包含自動熔斷,將中止將流量發送到被認爲不健康的實例,從而使他們有機會恢復並避免連鎖反應故障。
3)服務發現:Linkerd 與各類服務發現後端集成,經過刪除特定的(ad-hoc)服務發現實現來幫助您下降代碼的複雜性。
4)動態請求路由:Linkerd 啓用動態請求路由和從新路由,容許您使用最少許的配置來設置分段服務(staging service),金絲雀(canaries),藍綠部署(blue-green deploy),跨DC故障切換和黑暗流量(dark traffic)。
5)重試次數和截止日期:Linkerd能夠在某些故障時自動重試請求,而且能夠在指定的時間段以後讓請求超時。
6)TLS:Linkerd能夠配置爲使用TLS發送和接收請求,您能夠使用它來加密跨主機邊界的通訊,而不用修改現有的應用程序代碼。
7)HTTP代理集成:Linkerd能夠做爲HTTP代理,幾乎全部現代HTTP客戶端都普遍支持,使其易於集成到現有應用程序中。
8)透明代理:您能夠在主機上使用iptables規則,設置經過Linkerd的透明代理。
9)gRPC:Linkerd支持HTTP/2和TLS,容許它路由gRPC請求,支持高級RPC機制,如雙向流,流程控制和結構化數據負載。
10)分佈式跟蹤:Linkerd支持分佈式跟蹤和度量儀器,能夠提供跨越全部服務的統一的可觀察性。
11)儀器儀表:Linkerd支持分佈式跟蹤和度量儀器,能夠提供跨越全部服務的統一的可觀察性。

1八、hibernate的二級緩存有什麼用?
回答:由於應用程序訪問數據庫,讀寫數據的代價很是高,而利用持久層的緩存能夠減小應用程序與數據庫之間的交互,即把訪問過的數據保存到緩存中,應用程序再次訪問已經訪問過的數據,這些數據就能夠從緩存中獲取,而沒必要再從數據庫中獲取。同時若是數據庫中的數據被修改或者刪除,那麼是該數據所對應的緩存數據,也會被同步修改或刪除,進而保持緩存數據的一致性。

1九、介紹一下mybatis?
回答:1)入門簡單,即學即用,提供數據庫查詢的自動對象綁定功能,並且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來講,至關完美;

2)二級緩存機制不佳。

3)能夠進行更爲細緻的SQL優化,能夠減小查詢字段;

4)缺點就是框架仍是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,可是整個底層數據庫查詢實際仍是要本身寫的,工做量也比較大,並且不太容易適應快速數據庫修改;




20、 Shiro的原理?
回答:shiro是apache的一個開源框架,是一個權限管理的框架,實現用戶認證,用戶受權。spring中有spring security(原名Acegi),是一個權限框架,它和spring依賴過於緊密,沒有shiro使用簡單。shiro不依賴與spring,shiro不只能夠實現web應用的權限管理,還能夠實現c/s系統,分佈式系統權限管理,shiro屬於輕量級框架,愈來愈多的企業項目使用shiro。使用shiro實現系統的權限管理,有效提升開發效率,從而下降開發成本。
shiro架構有3個主要概念:Subject、SecurityManager、Realms。


1)Subject,正如咱們在教程中所說,Subject其實表明的就是當前正在執行操做的用戶,只不過由於「User」通常指代人,可是一個「Subject」能夠是人,也能夠是任何的第三方系統,服務帳號等任何其餘正在和當前系統交互的第三方軟件系統。
全部的Subject實例都被綁定到一個SecurityManager,若是你和一個Subject交互,全部的交互動做都會被轉換成Subject與SecurityManager的交互。

2)SecurityManager。SecurityManager是Shiro的核心,他主要用於協調Shiro內部各類安全組件,不過咱們通常不用太關心SecurityManager,對於應用程序開發者來講,主要仍是使用Subject的API來處理各類安全驗證邏輯。
3)Realm,這是用於鏈接Shiro和客戶系統的用戶數據的橋樑。一旦Shiro真正須要訪問各類安全相關的數據(好比使用用戶帳戶來作用戶身份驗證以及權限驗證)時,他老是經過調用系統配置的各類Realm來讀取數據。

正由於如此,Realm每每被看作是安全領域的DAO,他封裝了數據源鏈接相關的細節,將數據以Shiro須要的格式提供給Shiro。當咱們配置Shiro的時候,咱們至少須要配置一個Realm來提供用戶驗證和權限控制方面的數據。咱們可能會給SecurityManager配置多個Realm,可是無論怎樣,咱們至少須要配置一個。
Shiro提供了幾種開箱即用的Realm來訪問安全數據源,好比LDAP、關係數據庫、基於ini的安全配置文件等等,若是默認提供的這幾種Realm沒法知足你的需求,那麼你也能夠編寫本身的定製化的Realm插件。
和其餘內部組件同樣,SecurityManager決定了在Shiro中如何使用Realm來讀取身份和權限方面的數據,而後組裝成Subject實例。


shiro詳細架構:




2一、Webservice是什麼,怎麼用 ?
回答:從表面上看,WebService就是一個應用程序,它向外界暴露出一個可以經過Web進行調用的API。這就是說,你可以用編程的方法經過Web調用來實現某個功能的應用程序。從深層次上看,Web Service是一種新的Web應用程序分支,它們是自包含、自描述、模塊化的應用,能夠在網絡(一般爲Web)中被描述、發佈、查找以及經過Web來調用;Web Service即是基於網絡的、分佈式的模塊化組件,它執行特定的任務,遵照具體的技術規範,這些規範使得Web Service能與其餘兼容的組件進行互操做。它能夠使用標準的互聯網協議,像超文本傳輸協議HTTP和XML,將功能體如今互聯網和企業內部網上。WebService平臺是一套標準,它定義了應用程序如何在Web上實現互操做性。你能夠用你喜歡的任何語言,在你喜歡的任何平臺上寫Web Service;WebService 爲Internet 上的組件服務•經過網絡提供,以URL 定位方法調用•以Internet技術爲基礎•未來的分散式應用程序。

第一步:建立一個Java項目
  第二步:建立一個類,加入Webservice註解
@WebService是jdk提供的一個註解,它位於javax.jws.*這個包中。
  第三步:建立一個方法
  第四步:在main方法中調用jdk提供的發佈服務的方法
    經過EndPoint(端點服務)發佈一個webService。
Endpoint也是jdk提供的一個專門用於發佈服務的類,它的publish方法接收兩個參數,一個是本地的服務地址,二是提供服務的類。它位於javax.xml.ws.*包中。
static Endpoint.publish(String address, Object implementor) 在給定地址處針對指定的實現者對象建立併發布端點。
stop方法用於中止服務。
EndPoint發佈完成服務之後,將會獨立的線程運行。因此,publish
以後的代碼,能夠正常執行



2二、solr存數據是否是要建立索引?
回答:要建立,存數據以前須要建立標籤並設置屬性,須要建立的索引必須在Schema裏面有。

 

redis:

一、什麼是Redis?


回答:Redis是一個基於內存的高性能key-value數據庫;
應用場景:1)會話緩存(Session Cache) 2)全頁緩存(FPC)3)隊列 4)排行榜/計數器 5)發佈/訂閱

二、使用Redis有哪些好處?


回答:1)速度快,由於數據存在內存中,相似於HashMap,HashMap的優點就是查找和操做的時間複雜度都是O(1);
2)支持豐富的數據類型,支持string,list,set,sorted set,hash;

3)支持事務,操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行;

4)豐富的特性:可用於緩存,消息,按key設置過時時間,過時後將會自動刪除;

三、Redis的特色?


回答:Redis本質上是一個Key-Value類型的內存數據庫,很像memcached,整個數據庫通通加載在內存當中進行操做,按期經過異步操做把數據庫數據flush到硬盤上進行保存。由於是純內存操做,Redis的性能很是出色,每秒能夠處理超過10萬次讀寫操做,是已知性能最快的Key-Value DB.
Redis的出色之處不只僅是性能,Redis最大的魅力是支持保存多種數據結構,此外單個value的最大限制是1GB,不像memcached只能保存1MB的數據,另外Redis也能夠對存入的Key-Value設置expire時間。

Redis的主要缺點是數據庫容量受到物理內存的限制,不能用做海量數據的高性能讀寫,所以Redis適合的場景主要侷限在較小數據量的高性能操做和運算上。

四、爲何Redis須要把全部數據放到內存中?


回答:Redis爲了達到最快的讀寫速度將數據都讀到內存中,並經過異步的方式將數據寫入磁盤。因此redis具備快速和數據持久化的特徵。若是不將數據放在內存中,磁盤I/O速度會嚴重影響redis的性能。若是設置了最大使用的內存,則數據已有記錄數達到內存限值後不能繼續插入新值。


五、Redis常見的性能問題怎麼解決?


回答:1) Master最好不要作任何持久化工做,如RDB內存快照和AOF日誌文件;
2)若是數據比較重要,某個Slave開啓AOF備份數據,策略設置爲每秒同步一次;

3) 爲了主從複製的速度和鏈接的穩定性,Master和Slave最好在同一個局域網內;
4)儘可能避免在壓力很大的主庫上增長從庫;

5)主從複製不要用圖狀結構,用單向鏈表結構更爲穩定,即:Master <- Slave1 <- Slave2 <- Slave3…;

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。若是Master掛了,能夠馬上啓用Slave1作Master,其餘不變。

六、Redis與memcached有什麼區別?


回答:1) memcached全部的值均是簡單的字符串,redis做爲其替代者,支持更爲豐富的數據類型;
2) redis的速度比memcached快不少;
3) redis能夠持久化其數據;


七、Redis有哪些數據結構?


回答:經常使用的五種數據結構(string、list、set、hash、zset)

1)string :能夠是字符串,整數或者浮點數,對整個字符串或者字符串中的一部分執行操做,對整個整數或者浮點執行自增(increment)或者自減(decrement)操做。

2)list:一個鏈表,鏈表上的每一個節點都包含了一個字符串,蟲鏈表的兩端推入或者彈出元素,根據偏移量對鏈表進行修剪(trim),讀取單個或者多個元素,根據值查找或者移除元素。

3)set:包含字符串的無序收集器(unordered collection)、而且被包含的每一個字符串都是獨一無二的。添加,獲取,移除單個元素,檢查一個元素是否存在於集合中,計算交集,並集,差集,從集合裏面隨機獲取元素。

4)hash:包含鍵值對無序散列表,添加,獲取,移除當鍵值對,獲取全部鍵值對。

5)zset :字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定。添加,獲取,刪除單個元素,根據分值範圍(range)或者成員來獲取元素。

八、Redis持久化方案區別以及優缺點?


回答:redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。
RDB方式:是一種快照式的持久化方法,將某一時刻的數據持久化到磁盤中。

1)redis在進行數據持久化的過程當中,會先將數據寫入到一個臨時文件中,待持久化過程都結束了,纔會用這個臨時文件替換上次持久化好的文件。正是這種特性,讓咱們能夠隨時來進行備份,由於快照文件老是完整可用的。
2)對於RDB方式,redis會單首創建(fork)一個子進程來進行持久化,而主進程是不會進行任何IO操做的,這樣就確保了redis極高的性能。
3)若是須要進行大規模數據的恢復,且對於數據恢復的完整性不是很是敏感,那RDB方式要比AOF方式更加的高效。
AOF方式:是將執行過的寫指令記錄下來,在數據恢復時按照叢前到後的順序再將指令執行一遍。
1)AOF命令以redis協議追加保存每次寫的操做到文件末尾.Redis還能對AOF文件進行後臺重寫,使得AOF文件的體積不至於過大.默認的AOF持久化策略是每秒鐘fsync一次(fsync是指把緩存中的寫指令記錄到磁盤中),由於在這種狀況下,redis仍然能夠保持很好的處理性能,即便redis故障,也只會丟失最近1秒鐘的數據。
2)若是在追加日誌時,剛好遇到磁盤空間滿、inode滿或斷電等狀況致使日誌寫入不完整,也沒有關係,redis提供了redis-check-aof工具,能夠用來進行日誌修復。
3)由於採用了追加方式,若是不作任何處理的話,AOF文件會變得愈來愈大,爲此,redis提供了AOF文件重寫(rewrite)機制,即當AOF文件的大小超過所設定的閾值時,redis就會啓動AOF文件的內容壓縮,只保留能夠恢復數據的最小指令集。舉個例子或許更形象,假如咱們調用了100次INCR指令,在AOF文件中就要存儲100條指令,但這明顯是很低效的,徹底能夠把這100條指令合併成一條SET指令,這就是重寫機制的原理。
4)在進行AOF重寫時,仍然是採用先寫臨時文件,所有完成後再替換的流程,因此斷電、磁盤滿等問題都不會影響AOF文件的可用性。

九、如何來維護集羣之間的關係,或者說集羣之間如何創建鏈接?


回答:1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
2)節點的fail是經過集羣中超過半數的節點檢測失效時才生效.
3)客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可
4)redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value

十、Redis如何存取實體?


回答:存儲的時候須要將實體序列化,而後就能夠當字符串同樣存儲,取數據時也同樣,取出來的數據須要反序列化。


十一、Redis保留時間多久?


回答:若是未設置則一直存在,除非服務停掉且沒有保存到磁盤。若是已手動或自動保存過,則再次啓動服務還會存在。
EXPIRE <KEY> <TTL> : 將鍵的生存時間設爲 ttl 秒
PEXPIRE <KEY> <TTL> :將鍵的生存時間設爲 ttl 毫秒
EXPIREAT <KEY> <timestamp> :將鍵的過時時間設爲 timestamp 所指定的秒數時間戳
PEXPIREAT <KEY> <timestamp>: 將鍵的過時時間設爲 timestamp 所指定的毫秒數時間戳.


十二、Redis掛掉後怎麼辦?介紹Redis是怎麼實現高可用的?


回答:主要取決於,你是把redis做爲緩存仍是nosql,若是是緩存那丟了也無所謂,從別的地方恢復重建就好了,若是是nosql的話,redis是有snapshot和aof的機制來保證數據持久化的。
高可用實現流程:


1三、Redis有事務嗎,簡單的說一下?

回答:1) 開啓:以MULTI開始一個事務2) 入隊:將多個命令入隊到事務中,找到這些命令並不會當即執行,而是放到等待執行事務隊列裏面3) 執行:由EXEC命令觸發事務三個特性:單獨的隔離操做:事務的全部命令都會序列化、按順序地實行沒有隔離級別的概念:事務提交前任何指令都不會被實際執行不保證原子性:redis同一個事務中若是有一條命令執行失敗,其後的命令仍然會被執行,不回滾

相關文章
相關標籤/搜索