電子書下載地址: http://wiki.jikexueyuan.com/project/java-interview-bible/
1. 下列屬于關(guān)系型數(shù)據(jù)庫的是()
A. Oracle
B. MySql
C. IMS
D. MongoDB
答案:AB
解答:IMS(Information Management System )數(shù)據(jù)庫是 IBM 公司開發(fā)的兩種數(shù)據(jù)庫類型之一;
一種是關(guān)系數(shù)據(jù)庫,典型代表產(chǎn)品:DB2;
另一種則是層次數(shù)據(jù)庫,代表產(chǎn)品:IMS層次數(shù)據(jù)庫。
非關(guān)系型數(shù)據(jù)庫有MongoDB、memcachedb、Redis等。
2. 在進(jìn)行數(shù)據(jù)庫編程時(shí),連接池有什么作用?
答:由于創(chuàng)建連接和釋放連接都有很大的開銷(尤其是數(shù)據(jù)庫服務(wù)器不在本地時(shí),每次建立連接都需要進(jìn)行 TCP 的三次握手,再加上網(wǎng)絡(luò)延遲,造成的開銷是不可忽視的),為了提升系統(tǒng)訪問數(shù)據(jù)庫的性能,可以事先創(chuàng)建若干連接置于連接池中,需要時(shí)直接從連接池獲取,使用結(jié)束時(shí)歸還連接池而不必關(guān)閉連接,從而避免頻繁創(chuàng)建和釋放連接所造成的開銷,這是典型的用空間換取時(shí)間的策略(浪費(fèi)了空間存儲連接,但節(jié)省了創(chuàng)建和釋放連接的時(shí)間)。池化技術(shù)在 Java 開發(fā)中是很常見的,在使用線程時(shí)創(chuàng)建線程池的道理與此相同?;?Java 的開源數(shù)據(jù)庫連接池主要有: C3P0、Proxool、DBCP、BoneCP、Druid等。
【補(bǔ)充】在計(jì)算機(jī)系統(tǒng)中時(shí)間和空間是不可調(diào)和的矛盾,理解這一點(diǎn)對設(shè)計(jì)滿足性能要求的算法是至關(guān)重要的。大型網(wǎng)站性能優(yōu)化的一個(gè)關(guān)鍵就是使用緩存,而緩存跟上面講的連接池道理非常類似,也是使用空間換時(shí)間的策略。可以將熱點(diǎn)數(shù)據(jù)置于緩存中,當(dāng)用戶查詢這些數(shù)據(jù)時(shí)可以直接從緩存中得到,這無論如何也快過去數(shù)據(jù)庫中查詢。當(dāng)然,緩存的置換策略等也會對系統(tǒng)性能產(chǎn)生重要影響,對于這個(gè)問題的討論已經(jīng)超出了這里要闡述的范圍。
3. 什么是 DAO 模式?
答:DAO(DataAccess Object)顧名思義是一個(gè)為數(shù)據(jù)庫或其他持久化機(jī)制提供了抽象接口的對象,在不暴露數(shù)據(jù)庫實(shí)現(xiàn)細(xì)節(jié)的前提下提供了各種數(shù)據(jù)操作。為了建立一個(gè)健壯的 Java EE 應(yīng)用,應(yīng)該將所有對數(shù)據(jù)源的訪問操作進(jìn)行抽象化后封裝在一個(gè)公共 API 中。
用程序設(shè)計(jì)語言來說,就是建立一個(gè)接口,接口中定義了此應(yīng)用程序中將會用到的所有事務(wù)方法。在這個(gè)應(yīng)用程序中,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時(shí)候則使用這個(gè)接口,并且編寫一個(gè)單獨(dú)的類來實(shí)現(xiàn)這個(gè)接口,在邏輯上該類對應(yīng)一個(gè)特定的數(shù)據(jù)存儲。DAO 模式實(shí)際上包含了兩個(gè)模式,一是 Data Accessor(數(shù)據(jù)訪問器),二是 Data Object(數(shù)據(jù)對象),前者要解決如何訪問數(shù)據(jù)的問題,而后者要解決的是如何用對象封裝數(shù)據(jù)。
4. 什么是ORM?
答:對象關(guān)系映射(Object-Relational Mapping,簡稱 ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫的關(guān)系模型互不匹配問題的技術(shù);簡單的說,ORM 是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)(可以用 XML 或者是注解),將 Java 程序中的對象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中或者將關(guān)系數(shù)據(jù)庫表中的行轉(zhuǎn)換成 Java 對象,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。
5. JDBC 中如何進(jìn)行事務(wù)處理?
答:Connection 提供了事務(wù)處理的方法,通過調(diào)用setAutoCommit(false)可以設(shè)置手動(dòng)提交事務(wù);當(dāng)事務(wù)完成后用 commit()顯式提交事務(wù);如果在事務(wù)處理過程中發(fā)生異常則通過 rollback() 進(jìn)行事務(wù)回滾。除此之外,較新的 JDBC 標(biāo)準(zhǔn)還引入了Savepoint(保存點(diǎn))的概念,允許事務(wù)回滾到指定的保存點(diǎn)。
6. 事務(wù)的 ACID 是指什么?
答:
1)原子性(Atomic):事務(wù)中各項(xiàng)操作,要么全做要么全不做,任何一項(xiàng)操作的失敗都會導(dǎo)致整個(gè)事務(wù)的失?。?/p>
2)一致性(Consistent):事務(wù)結(jié)束后系統(tǒng)狀態(tài)是一致的;
3)隔離性(Isolated):并發(fā)執(zhí)行的事務(wù)彼此無法看到對方的中間狀態(tài);
4)持久性(Durable):事務(wù)完成后所做的改動(dòng)都會被持久化,即使發(fā)生災(zāi)難性的失敗。通過日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)。
【補(bǔ)充】關(guān)于事務(wù),在面試中被問到的概率是很高的,可以問的問題也是很多的。首先需要知道的是,只有存在并發(fā)數(shù)據(jù)訪問時(shí)才需要事務(wù)。
7. 使用 JDBC 操作數(shù)據(jù)庫時(shí),如何提升讀取數(shù)據(jù)的性能?如何提升更新數(shù)據(jù)的性能?
答:要提升讀取數(shù)據(jù)的性能,可以指定通過結(jié)果集(ResultSet)對象指定每次抓取數(shù)據(jù)的大?。╢etch size);要提升更新數(shù)據(jù)的性能可以使用PreparedStatement語句構(gòu)建批處理(batch)。
8. 存儲過程和函數(shù)的區(qū)別
答:
從參數(shù)的返回情況來看:
如果返回多個(gè)參數(shù)值最好使用存儲過程,如果只有一個(gè)返回值的話可以使用函數(shù)。
從調(diào)用情況來看:
如果在 SQL 語句(DML 或 SELECT)中調(diào)用的話一定是存儲函數(shù)或存儲的封裝函數(shù)不可以是存儲過程,但調(diào)用存儲函數(shù)的時(shí)候還有好多限制以及函數(shù)的純度等級的問題,如果是在過程化語句中調(diào)用的話,就要看你要實(shí)現(xiàn)什么樣的功能。函數(shù)一般情況下是用來計(jì)算并返回一個(gè)計(jì)算結(jié)果而存儲過程一般是用來完成特定的數(shù)據(jù)操作(比如修改、插入數(shù)據(jù)庫表或執(zhí)行某些 DDL 語句等等),所以雖然他們的語法上很相似但用戶在使用他們的時(shí)候所需要完成的功能大部分情況下是不同的。
9. 你認(rèn)為在表上建立索引可以提高數(shù)據(jù)庫系統(tǒng)的效率嗎,為什么?
答:不一定
建立太多的索引將會影響更新和插入的速度,因?yàn)樗枰瑯痈旅總€(gè)索引文件。對于一個(gè)經(jīng)常需要更新和插入的表格,就沒有必要為一個(gè)很少使用的 where 子句單獨(dú)建立索引了,對于比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
10. 什么是數(shù)據(jù)庫的參照完整性?
答:數(shù)據(jù)庫的參照完整性是指表與表之間的一種對應(yīng)關(guān)系,通常情況下可以通過設(shè)置兩表之間的主鍵、外鍵關(guān)系,或者編寫兩表的觸發(fā)器來實(shí)現(xiàn)。 有對應(yīng)參照完整性的兩張表格,在對他們進(jìn)行數(shù)據(jù)插入、更新、刪除的過程中,系統(tǒng)都會將被修改表格與另一張對應(yīng)表格進(jìn)行對照,從而阻止一些不正確的數(shù)據(jù)的操作。
11. 如何優(yōu)化數(shù)據(jù)庫,如何提高數(shù)據(jù)庫的性能?
答:
1)硬件調(diào)整性能 最有可能影響性能的是磁盤和網(wǎng)絡(luò)吞吐量,解決辦法擴(kuò)大虛擬內(nèi)存,并保證有足夠可以擴(kuò)充的空間;把數(shù)據(jù)庫服務(wù)器上的不必要服務(wù)關(guān)閉掉;把數(shù)據(jù)庫服務(wù)器和主域服務(wù)器分開;把 SQL 數(shù)據(jù)庫服務(wù)器的吞吐量調(diào)為最大;在具有一個(gè)以上處理器的機(jī)器上運(yùn)行 SQL 。
2)調(diào)整數(shù)據(jù)庫
若對該表的查詢頻率比較高,則建立索引;建立索引時(shí),想盡對該表的所有查詢搜索操作, 按照 where 選擇條件建立索引,盡量為整型鍵建立為有且只有一個(gè)簇集索引,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁上,縮短查找范圍,為在查詢經(jīng)常使用的全部列建立非簇集索引,能最大地覆蓋查詢;但是索引不可太多,執(zhí)行 UPDATE DELETE INSERT 語句需要用于維護(hù)這些索引的開銷量急劇增加;避免在索引中有太多的索引鍵;避免使用大型數(shù)據(jù)類型的列為索引;保證每個(gè)索引鍵值有少數(shù)行。
3)使用存儲過程
應(yīng)用程序的實(shí)現(xiàn)過程中,能夠采用存儲過程實(shí)現(xiàn)的對數(shù)據(jù)庫的操作盡量通過存儲過程來實(shí)現(xiàn),因?yàn)榇鎯^程是存放在數(shù)據(jù)庫服務(wù)器上的一次性被設(shè)計(jì)、編碼、測試,并被再次使用,需要執(zhí)行該任務(wù)的應(yīng)用可以簡單地執(zhí)行存儲過程,并且只返回結(jié)果集或者數(shù)值,這樣不僅可以使程序模塊化,同時(shí)提高響應(yīng)速度,減少網(wǎng)絡(luò)流量,并且通過輸入?yún)?shù)接受輸入,使得在應(yīng)用中完成邏輯的一致性實(shí)現(xiàn)。
4)應(yīng)用程序結(jié)構(gòu)和算法
建立查詢條件索引僅僅是提高速度的前提條件,響應(yīng)速度的提高還依賴于對索引的使用。因?yàn)槿藗冊?/p>
使用SQL時(shí)往往會陷入一個(gè)誤區(qū),即太關(guān)注于所得的結(jié)果是否正確,特別是對數(shù)據(jù)量不是特別大的數(shù)據(jù)庫操作時(shí),是否建立索引和使用索引的好壞對程序的響應(yīng)速度并不大,因此程序員在書寫程序時(shí)就忽略了不同的實(shí)現(xiàn)方法之間可能存在的性能差異,這種性能差異在數(shù)據(jù)量特別大時(shí)或者大型的或是復(fù)雜的數(shù)據(jù)庫環(huán)境中(如聯(lián)機(jī)事務(wù)處理 OLTP 或決策支持系統(tǒng) DSS )中表現(xiàn)得尤為明顯。在工作實(shí)踐中發(fā)現(xiàn),不良的 SQL 往往來自于不恰當(dāng)?shù)乃饕O(shè)計(jì)、不充份的連接條件和不可優(yōu)化的 where 子句。在對它們進(jìn)行適當(dāng)?shù)膬?yōu)化后,其運(yùn)行速度有了明顯地提高!