電子書(shū)下載地址: http://wiki.jikexueyuan.com/project/java-interview-bible/
1. 下列屬于關(guān)系型數(shù)據(jù)庫(kù)的是()
A. Oracle
B. MySql
C. IMS
D. MongoDB
答案:AB
解答:IMS(Information Management System )數(shù)據(jù)庫(kù)是 IBM 公司開(kāi)發(fā)的兩種數(shù)據(jù)庫(kù)類(lèi)型之一;
一種是關(guān)系數(shù)據(jù)庫(kù),典型代表產(chǎn)品:DB2翩肌;
另一種則是層次數(shù)據(jù)庫(kù)章喉,代表產(chǎn)品:IMS層次數(shù)據(jù)庫(kù)。
非關(guān)系型數(shù)據(jù)庫(kù)有MongoDB底桂、memcachedb泉懦、Redis等片部。
2. 在進(jìn)行數(shù)據(jù)庫(kù)編程時(shí),連接池有什么作用暇番?
答:由于創(chuàng)建連接和釋放連接都有很大的開(kāi)銷(xiāo)(尤其是數(shù)據(jù)庫(kù)服務(wù)器不在本地時(shí)嗤放,每次建立連接都需要進(jìn)行 TCP 的三次握手,再加上網(wǎng)絡(luò)延遲奔誓,造成的開(kāi)銷(xiāo)是不可忽視的)斤吐,為了提升系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)的性能,可以事先創(chuàng)建若干連接置于連接池中厨喂,需要時(shí)直接從連接池獲取和措,使用結(jié)束時(shí)歸還連接池而不必關(guān)閉連接,從而避免頻繁創(chuàng)建和釋放連接所造成的開(kāi)銷(xiāo)蜕煌,這是典型的用空間換取時(shí)間的策略(浪費(fèi)了空間存儲(chǔ)連接派阱,但節(jié)省了創(chuàng)建和釋放連接的時(shí)間)。池化技術(shù)在 Java 開(kāi)發(fā)中是很常見(jiàn)的斜纪,在使用線程時(shí)創(chuàng)建線程池的道理與此相同贫母。基于 Java 的開(kāi)源數(shù)據(jù)庫(kù)連接池主要有: C3P0盒刚、Proxool腺劣、DBCP、BoneCP因块、Druid等橘原。
【補(bǔ)充】在計(jì)算機(jī)系統(tǒng)中時(shí)間和空間是不可調(diào)和的矛盾,理解這一點(diǎn)對(duì)設(shè)計(jì)滿足性能要求的算法是至關(guān)重要的。大型網(wǎng)站性能優(yōu)化的一個(gè)關(guān)鍵就是使用緩存趾断,而緩存跟上面講的連接池道理非常類(lèi)似拒名,也是使用空間換時(shí)間的策略∮笞茫可以將熱點(diǎn)數(shù)據(jù)置于緩存中增显,當(dāng)用戶查詢這些數(shù)據(jù)時(shí)可以直接從緩存中得到,這無(wú)論如何也快過(guò)去數(shù)據(jù)庫(kù)中查詢脐帝。當(dāng)然同云,緩存的置換策略等也會(huì)對(duì)系統(tǒng)性能產(chǎn)生重要影響,對(duì)于這個(gè)問(wèn)題的討論已經(jīng)超出了這里要闡述的范圍堵腹。
3. 什么是 DAO 模式梢杭?
答:DAO(DataAccess Object)顧名思義是一個(gè)為數(shù)據(jù)庫(kù)或其他持久化機(jī)制提供了抽象接口的對(duì)象,在不暴露數(shù)據(jù)庫(kù)實(shí)現(xiàn)細(xì)節(jié)的前提下提供了各種數(shù)據(jù)操作秸滴。為了建立一個(gè)健壯的 Java EE 應(yīng)用,應(yīng)該將所有對(duì)數(shù)據(jù)源的訪問(wèn)操作進(jìn)行抽象化后封裝在一個(gè)公共 API 中募判。
用程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō)荡含,就是建立一個(gè)接口,接口中定義了此應(yīng)用程序中將會(huì)用到的所有事務(wù)方法届垫。在這個(gè)應(yīng)用程序中释液,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時(shí)候則使用這個(gè)接口,并且編寫(xiě)一個(gè)單獨(dú)的類(lèi)來(lái)實(shí)現(xiàn)這個(gè)接口装处,在邏輯上該類(lèi)對(duì)應(yīng)一個(gè)特定的數(shù)據(jù)存儲(chǔ)误债。DAO 模式實(shí)際上包含了兩個(gè)模式,一是 Data Accessor(數(shù)據(jù)訪問(wèn)器)妄迁,二是 Data Object(數(shù)據(jù)對(duì)象)寝蹈,前者要解決如何訪問(wèn)數(shù)據(jù)的問(wèn)題,而后者要解決的是如何用對(duì)象封裝數(shù)據(jù)登淘。
4. 什么是ORM箫老?
答:對(duì)象關(guān)系映射(Object-Relational Mapping,簡(jiǎn)稱 ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫(kù)的關(guān)系模型互不匹配問(wèn)題的技術(shù)黔州;簡(jiǎn)單的說(shuō)耍鬓,ORM 是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù)(可以用 XML 或者是注解),將 Java 程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中或者將關(guān)系數(shù)據(jù)庫(kù)表中的行轉(zhuǎn)換成 Java 對(duì)象流妻,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式牲蜀。
5. JDBC 中如何進(jìn)行事務(wù)處理?
答:Connection 提供了事務(wù)處理的方法绅这,通過(guò)調(diào)用setAutoCommit(false)可以設(shè)置手動(dòng)提交事務(wù)涣达;當(dāng)事務(wù)完成后用 commit()顯式提交事務(wù);如果在事務(wù)處理過(guò)程中發(fā)生異常則通過(guò) 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)操作的失敗都會(huì)導(dǎo)致整個(gè)事務(wù)的失斄迫稀完残;
2)一致性(Consistent):事務(wù)結(jié)束后系統(tǒng)狀態(tài)是一致的;
3)隔離性(Isolated):并發(fā)執(zhí)行的事務(wù)彼此無(wú)法看到對(duì)方的中間狀態(tài)横漏;
4)持久性(Durable):事務(wù)完成后所做的改動(dòng)都會(huì)被持久化谨设,即使發(fā)生災(zāi)難性的失敗。通過(guò)日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)缎浇。
【補(bǔ)充】關(guān)于事務(wù)扎拣,在面試中被問(wèn)到的概率是很高的,可以問(wèn)的問(wèn)題也是很多的素跺。首先需要知道的是二蓝,只有存在并發(fā)數(shù)據(jù)訪問(wèn)時(shí)才需要事務(wù)。
7. 使用 JDBC 操作數(shù)據(jù)庫(kù)時(shí)指厌,如何提升讀取數(shù)據(jù)的性能刊愚?如何提升更新數(shù)據(jù)的性能?
答:要提升讀取數(shù)據(jù)的性能踩验,可以指定通過(guò)結(jié)果集(ResultSet)對(duì)象指定每次抓取數(shù)據(jù)的大信阜獭(fetch size);要提升更新數(shù)據(jù)的性能可以使用PreparedStatement語(yǔ)句構(gòu)建批處理(batch)箕憾。
8. 存儲(chǔ)過(guò)程和函數(shù)的區(qū)別
答:
從參數(shù)的返回情況來(lái)看:
如果返回多個(gè)參數(shù)值最好使用存儲(chǔ)過(guò)程牡借,如果只有一個(gè)返回值的話可以使用函數(shù)。
從調(diào)用情況來(lái)看:
如果在 SQL 語(yǔ)句(DML 或 SELECT)中調(diào)用的話一定是存儲(chǔ)函數(shù)或存儲(chǔ)的封裝函數(shù)不可以是存儲(chǔ)過(guò)程袭异,但調(diào)用存儲(chǔ)函數(shù)的時(shí)候還有好多限制以及函數(shù)的純度等級(jí)的問(wèn)題蓖捶,如果是在過(guò)程化語(yǔ)句中調(diào)用的話,就要看你要實(shí)現(xiàn)什么樣的功能扁远。函數(shù)一般情況下是用來(lái)計(jì)算并返回一個(gè)計(jì)算結(jié)果而存儲(chǔ)過(guò)程一般是用來(lái)完成特定的數(shù)據(jù)操作(比如修改俊鱼、插入數(shù)據(jù)庫(kù)表或執(zhí)行某些 DDL 語(yǔ)句等等),所以雖然他們的語(yǔ)法上很相似但用戶在使用他們的時(shí)候所需要完成的功能大部分情況下是不同的畅买。
9. 你認(rèn)為在表上建立索引可以提高數(shù)據(jù)庫(kù)系統(tǒng)的效率嗎并闲,為什么?
答:不一定
建立太多的索引將會(huì)影響更新和插入的速度谷羞,因?yàn)樗枰瑯痈旅總€(gè)索引文件帝火。對(duì)于一個(gè)經(jīng)常需要更新和插入的表格溜徙,就沒(méi)有必要為一個(gè)很少使用的 where 子句單獨(dú)建立索引了,對(duì)于比較小的表犀填,排序的開(kāi)銷(xiāo)不會(huì)很大蠢壹,也沒(méi)有必要建立另外的索引。
10. 什么是數(shù)據(jù)庫(kù)的參照完整性九巡?
答:數(shù)據(jù)庫(kù)的參照完整性是指表與表之間的一種對(duì)應(yīng)關(guān)系图贸,通常情況下可以通過(guò)設(shè)置兩表之間的主鍵、外鍵關(guān)系冕广,或者編寫(xiě)兩表的觸發(fā)器來(lái)實(shí)現(xiàn)疏日。 有對(duì)應(yīng)參照完整性的兩張表格,在對(duì)他們進(jìn)行數(shù)據(jù)插入撒汉、更新沟优、刪除的過(guò)程中,系統(tǒng)都會(huì)將被修改表格與另一張對(duì)應(yīng)表格進(jìn)行對(duì)照睬辐,從而阻止一些不正確的數(shù)據(jù)的操作挠阁。
11. 如何優(yōu)化數(shù)據(jù)庫(kù),如何提高數(shù)據(jù)庫(kù)的性能?
答:
1)硬件調(diào)整性能 最有可能影響性能的是磁盤(pán)和網(wǎng)絡(luò)吞吐量,解決辦法擴(kuò)大虛擬內(nèi)存溯饵,并保證有足夠可以擴(kuò)充的空間鹃唯;把數(shù)據(jù)庫(kù)服務(wù)器上的不必要服務(wù)關(guān)閉掉;把數(shù)據(jù)庫(kù)服務(wù)器和主域服務(wù)器分開(kāi)瓣喊;把 SQL 數(shù)據(jù)庫(kù)服務(wù)器的吞吐量調(diào)為最大;在具有一個(gè)以上處理器的機(jī)器上運(yùn)行 SQL 黔酥。
2)調(diào)整數(shù)據(jù)庫(kù)
若對(duì)該表的查詢頻率比較高藻三,則建立索引;建立索引時(shí)跪者,想盡對(duì)該表的所有查詢搜索操作棵帽, 按照 where 選擇條件建立索引,盡量為整型鍵建立為有且只有一個(gè)簇集索引渣玲,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁(yè)上逗概,縮短查找范圍,為在查詢經(jīng)常使用的全部列建立非簇集索引忘衍,能最大地覆蓋查詢逾苫;但是索引不可太多,執(zhí)行 UPDATE DELETE INSERT 語(yǔ)句需要用于維護(hù)這些索引的開(kāi)銷(xiāo)量急劇增加枚钓;避免在索引中有太多的索引鍵铅搓;避免使用大型數(shù)據(jù)類(lèi)型的列為索引;保證每個(gè)索引鍵值有少數(shù)行搀捷。
3)使用存儲(chǔ)過(guò)程
應(yīng)用程序的實(shí)現(xiàn)過(guò)程中星掰,能夠采用存儲(chǔ)過(guò)程實(shí)現(xiàn)的對(duì)數(shù)據(jù)庫(kù)的操作盡量通過(guò)存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn),因?yàn)榇鎯?chǔ)過(guò)程是存放在數(shù)據(jù)庫(kù)服務(wù)器上的一次性被設(shè)計(jì)、編碼氢烘、測(cè)試怀偷,并被再次使用,需要執(zhí)行該任務(wù)的應(yīng)用可以簡(jiǎn)單地執(zhí)行存儲(chǔ)過(guò)程播玖,并且只返回結(jié)果集或者數(shù)值椎工,這樣不僅可以使程序模塊化,同時(shí)提高響應(yīng)速度黎棠,減少網(wǎng)絡(luò)流量晋渺,并且通過(guò)輸入?yún)?shù)接受輸入,使得在應(yīng)用中完成邏輯的一致性實(shí)現(xiàn)脓斩。
4)應(yīng)用程序結(jié)構(gòu)和算法
建立查詢條件索引僅僅是提高速度的前提條件木西,響應(yīng)速度的提高還依賴于對(duì)索引的使用。因?yàn)槿藗冊(cè)?/p>
使用SQL時(shí)往往會(huì)陷入一個(gè)誤區(qū)随静,即太關(guān)注于所得的結(jié)果是否正確八千,特別是對(duì)數(shù)據(jù)量不是特別大的數(shù)據(jù)庫(kù)操作時(shí),是否建立索引和使用索引的好壞對(duì)程序的響應(yīng)速度并不大燎猛,因此程序員在書(shū)寫(xiě)程序時(shí)就忽略了不同的實(shí)現(xiàn)方法之間可能存在的性能差異恋捆,這種性能差異在數(shù)據(jù)量特別大時(shí)或者大型的或是復(fù)雜的數(shù)據(jù)庫(kù)環(huán)境中(如聯(lián)機(jī)事務(wù)處理 OLTP 或決策支持系統(tǒng) DSS )中表現(xiàn)得尤為明顯。在工作實(shí)踐中發(fā)現(xiàn)重绷,不良的 SQL 往往來(lái)自于不恰當(dāng)?shù)乃饕O(shè)計(jì)沸停、不充份的連接條件和不可優(yōu)化的 where 子句。在對(duì)它們進(jìn)行適當(dāng)?shù)膬?yōu)化后昭卓,其運(yùn)行速度有了明顯地提高愤钾!