本次面試題是本人面試後的總結,我把所有能想到的都寫了,如果有什麼不對的,請各位指正
XX網面試 問題
1、 oracle和mysql分頁都是怎麼分頁的。
2、 Oracle 的rowID和rowNum有什麼區別;
3、 Oracle或者mysql資料量比較大的時候分頁怎麼分才會比較快,即如何用rowID關鍵字來快速分頁;
4、 Mysql資料量非常大(幾百萬幾千萬)的時候怎麼分頁查詢;
5、 Oracle和mysql 分頁時使用order by 方在哪個位置;
6、 索引(Index):單列索引和聯合索引的區別;聯合索引時多個欄位(A、B、C)三個字欄位,如果只有BC,會不會走這個索引,資料庫解析SQL的順序、SQL解析器,轉成執行計畫
7、 資料庫SQL的解析順序,SQL解析器,執行計畫;
8、 資料庫連接池相關問題;
9、 線程池;
10、 分布式架構:dubbo;
11、 多看看源碼;
12、 java同步synchronized問題;
13、 集合類:collection 和set list的子集;arrayList和linkedList 的區別;如何把這兩個List變成安全執行緒的list
14、 Linux常用指令:top、kill-9 :為啥要加-9。
15、 Linux對某個使用者的線程數量的約束;
16、 Oracle彙總查詢函數;
17、 單例模式用在什麼地方;
18、 責任鏈模式是怎麼實現的,策略模式和責任鏈模式的區別;
19、 有沒有寫過過濾器;
20、 SpringMVC常用的註解;ulimit、service、controler、responseBody、Transaction
21、 定時任務失敗之後重新跑怎麼跑;發簡訊和發郵件的時候因為網路原因發失敗,有100個人,只發了30個人,系統重啟之後如何?重新發送剩下70個人的方法;
22、 SpringMVC 事務加在哪個層(dao層、service層、controller層);
23、 (Transaction)事務的註解;
24、 Redis緩衝;
25、 MQ緩衝系統;
面試者建議:設計模式寫的少,沒有毛病,但是需要注意Java基礎知識;
答案
1、 對於Mysql資料庫,我們可以採用limit語句進行分頁,對於oracle資料庫,我們可以採用rownum的方式進行分頁;
l Mysql的limit m,n語句;
Limit後的兩個參數中,參數m是起始下表,它從0 開始;參數n是返回的記錄數。我們需要分頁的話置頂這兩個值即可;
l Oracel資料庫的rownum’;
在oracle資料庫中,分頁方式沒有Mysql這樣簡單,它需要依靠rownum來實現。RowNum表示一條記錄的行號,這個行號是資料載入到記憶體中然後取出來的。他是在擷取每一行之後才給它賦予行號,因此想置頂rownum的區間來取得分頁資料在一層查詢語句中是無法做到的,要分頁還要再進行一次查詢。
Select * from
(
Selecta.* ,a.rownum rn from a
(
(Select * from user ) a where a.rownum<20
) where rn>10;
)
其中最內層的查詢 select * fromuser 表示不進行翻頁的原始查詢語句。
Rownum<20和rn》10控制分頁查詢的每頁的範圍;上面給出的這個份額查詢條件,在大多數情況下有較高的效率。分頁的目的就是控制輸出結果集的大小,將結果集儘快的返回。在上面的查詢語句中,這種考慮主要體現在where a.rownum <20這句話中,還有一種查詢方法如下:
Select * from
(
Select A.*,rownum rn from
(
Select* from user a
)where rn between 10 and 20
)
在絕大多數情況下第一種方法效率比較高,效率高的原因有涉及到SQL的解析順序,有興趣的同學自行百度
2、 Rowed和rownum有什麼區別
Rownum和rowid都是虛列,但是含義完全不同。Rowid是物理地址,用於定位oracle中具體資料的實體儲存體位置,而rownum則是sql輸出結果的排序。通俗的講:rowid是不變的,rownum是會變化的,尤其是在使用order by 的時候;
Rowed:用於定位元據表中的某一條資料的位置,是唯一的,也是不變的。
Rownum:表示查詢某條記錄在整個結果集中的位置,同一條記錄查詢條件不同對應的榮威怒罵不同,而rowid是不會變的。
3、 Oracle和mysql資料量比較大的時,如何最佳化sql,使其在分頁的時候查詢速度較快;
4、 Oracle和mysql在使用分頁的時候,orderby放在哪個位置。
Oracle在分頁時使用orderby,放在兩層嵌套的裡面,即放在兩個where子句:where rownum<30 和whererownum>10 的裡面。
5、 單列索引和聯合索引的區別,聯合索引如何使用;
單列索引:只要條件(where子句中)中出現索引列,無論在什麼位置,都能利用索引查詢;
聯合索引:1)、條件查詢中出現聯合索引第一列,或者全部,則能利用聯合索引(與SQL解析順序有關係);2)、條件中只要條件相連在一起,無論前後,都會利用上聯合索引;3)、查詢條件中沒有出現聯合索引的第一列,而出現了聯合索引的第二列、或者第三列,則都不使用聯合索引進行查詢。
在什麼時候才需要建立索引呢:一般來說,在where 和jion中出現的列需要建立索引,但是也不完全如此,因為mysql只是對<,<=,=,>,>=,BETWEEN ,IN ,以及某些時候的理科才會使用索引;在以萬用字元%和_開頭做查詢時候,mysql不會使用索引。
索引的不足之處:雖然索引大大提高了查詢速度,同事會降低更新表的速度,如對錶進行insert、update、delete;因為更新表的時候,mysql不僅要儲存資料,還要儲存索引檔案。
如果資料量大,且同時使用了索引,那麼這個時候如果需要添加大量資料,可在淩晨時候刪除索引,然後添加資料,添加完資料之後再講聯合索引加上。
6、 SQL解析順序,SQL解析器——這部分自行百度吧
7、 資料庫連接池:
資料庫連接池負責分配、管理和釋放資料庫連接,他允許應用程式重複使用一個現有的資料庫連接,而不是在重建立立一個,釋放空閑時間超過最大空閑時間的資料庫應該來避免因為沒有釋放資料庫連接二引起的資料庫連接遺漏,這項技術能明顯提高資料庫操作的效能;
原理:串連池的基本的思想實在系統初始化的時候,將資料庫連接作為Object Storage Service在記憶體中,當使用者需要訪問資料庫時,並非建立一個新的串連,而是從串連池中取出一個已經建立的空閑連線物件。使用完畢後,使用者也並非將串連關閉,而是將串連放回串連池,一共下一個請求訪問使用。而串連的建立、斷開都是有串連池自身管理的。同事還可以通過設定串連池的參數來控制串連池初始串連數、串連的上下限以及每個串連的最大使用次數、最大空閑時間等;
Java中開源的資料庫連接池有一下幾種:DBCP、Proxool、C3P0
C3P0比較小號資源,效率較低;
DBCP存在bug;
Proxool較好,而且提供即時監控串連池狀態功能,便於發現串連池泄露的情況。
串連池、資料來源、JNDI三者之間的關係:
串連池:
串連池是由容器(比如tomcat)提供的,用來管理串連池中的連線物件;
串連池自動分配連線物件並對閑置的串連進行回收;
串連池中的連線物件是由資料來源(DataSource)建立的。
串連池(Connection Pool)用來管理串連(Connection)對象
資料來源:
資料來源(DataSource)用來串連資料庫、建立串連(connection)對象;
Java.sql.DataSource介面負責建立與資料庫的串連,有Tomcat提供,將串連儲存在串連池中。
JDNI(Java Naming and Directory Interface,Java命名和目錄介面):
在程式中使用JNDI擷取資料來源,通過資料來源建立的連線物件唄統一的放入到串連池中進行管理
8、 線程池問題較多,也比較複雜,這裡就不做解釋,具體請自行百度:http://www.importnew.com/12773.html
9、 分布式架構dubbo——自行百度吧,我也沒用過。。。
10、 Javasynchronize問題也自行百度吧,網上都是解答;
11、 集合類:ArrayList和linkedList的區別:
ArrayList查詢時速度快,內部是用數組進行實現的,數組有下標,所以查詢速度較快,增加和修改時較慢,linkedList在增加和修改時較快,查詢時較慢,linkedList內部實現為鏈式結構,裡面儲存的元素收尾相連,找到前一個就可以直接找到後一個元素,所以在增加或者修改的時候可以直接修改指向下一個元素的地址,但是查詢時較慢,要遍曆整個list進行查詢;
其中ArrayList是線程不安全的,linkedList是安全執行緒的。如何將兩個list變成安全執行緒的list:
List<String> list =Collections.synchornizedList(new ArrayList<String>());
List<String> list =Collections.synchornizedList(new LinkedList<String>());
更詳細部分請看:http://blog.csdn.net/hp_yangpeng/article/details/78510991
12、 伺服器維護常用的指令:
top命令詳解:該命令經常用來監控Linux的系統狀況,比如cpu、記憶體的使用
第一行:
1:08:45:系統目前時間;
10 days,3:05-系統已經運行了10天3小時05分鐘了(這期間沒有重啟過);
Load average:後面的三個參數需要經過計算,計算完畢後可以判斷是否超負荷運轉;
第二行:
Tasks:135 total,系統現在共有135個進程,其中有一個正在運行,134個正在休眠,0個殭屍進程(zombie:殭屍進程);
第三行:CPU的狀態(共四個cpu)
0.3%us-使用者空間佔用CPU的百分比;
0.0%sy –內科空間佔用CPU百分比;
0.0%ni-改變過優先順序的進程佔用的CPU百分比
0.0%wa-IO等待佔用CPU百分比
0.0% hi –硬中斷(Hardware IRQ)佔用CPU的百分比
0.0% si-軟中軟(software Interrupts)佔用CPU的百分比;
第四行:記憶體狀態
3908060k total-實體記憶體總量(4g);
3660048k used –使用中的記憶體總量(3.6G)
148012k free-空閑記憶體總量(148M)
359760 buffers –緩衝的記憶體量(359M)
Kill -9 殺進程:-9 是表示強制停止進程,有些時候僅使用kill,進程殺不掉;
詳見:http://blog.csdn.net/hp_yangpeng/article/details/78511051
13、 Linux對某個使用者線程數量的約束
查看系統支援的最大線程數量,一般很大,相當於理論值;
cat /proc/sys/kernel/pid_max----------32768
cat /proc/sys/kernel/threads –max 4132217
max_user_process #系統限制某喲使用者下最多可以運行多少線程或進程,使用命令:ulimit –u
ulimit –u -----------1024
註:修改max_user_process的數值,只需要膝蓋/etc/security/limits.conf即可,但是這個參數需要修改/etc/security/limits.d/90-nproc.conf
14、 Oracle 彙總查詢函數:常用的彙總函式有:sum、avg、min、max、count等,其他彙總函式請自行百度吧。
15、 Java設計模式
單利模式:主要有懶漢模式、餓漢模式,
具體實現如下:
1、 懶漢模式,安全執行緒:
Public class singleon{
Privatestatic Singleton instance;
Priate Singleton (){}
Public static synchronized SingletongetInstance(){
If(instance==null){
Instance= new Singleton();
}
Return instance;
}
}
2、 餓漢模式,安全執行緒;
Public class Singleton {
Privatestatic Singleton instance = new Singleton();
Private Singleton(){}
Public static Singleton getInstance(){
Return instance
}
}
責任鏈模式內容較多,建議網上看視頻進行學習;
16、 Redis和MQ緩衝問題較多,建議自己慢慢學習(我也不會)