Java程序員筆試必備--JDBC與數(shù)據(jù)庫

電子書下載地址: http://wiki.jikexueyuan.com/project/java-interview-bible/

1. 下列屬于關系型數(shù)據(jù)庫的是()

A. Oracle
B. MySql
C. IMS
D. MongoDB

答案:AB

解答:IMS(Information Management System )數(shù)據(jù)庫是 IBM 公司開發(fā)的兩種數(shù)據(jù)庫類型之一;

一種是關系數(shù)據(jù)庫,典型代表產(chǎn)品:DB2;
另一種則是層次數(shù)據(jù)庫,代表產(chǎn)品:IMS層次數(shù)據(jù)庫。

非關系型數(shù)據(jù)庫有MongoDB、memcachedb、Redis等。

2. 在進行數(shù)據(jù)庫編程時,連接池有什么作用?

答:由于創(chuàng)建連接和釋放連接都有很大的開銷(尤其是數(shù)據(jù)庫服務器不在本地時,每次建立連接都需要進行 TCP 的三次握手,再加上網(wǎng)絡延遲,造成的開銷是不可忽視的),為了提升系統(tǒng)訪問數(shù)據(jù)庫的性能,可以事先創(chuàng)建若干連接置于連接池中,需要時直接從連接池獲取,使用結(jié)束時歸還連接池而不必關閉連接,從而避免頻繁創(chuàng)建和釋放連接所造成的開銷,這是典型的用空間換取時間的策略(浪費了空間存儲連接,但節(jié)省了創(chuàng)建和釋放連接的時間)。池化技術(shù)在 Java 開發(fā)中是很常見的,在使用線程時創(chuàng)建線程池的道理與此相同。基于 Java 的開源數(shù)據(jù)庫連接池主要有: C3P0、Proxool、DBCP、BoneCP、Druid等。

【補充】在計算機系統(tǒng)中時間和空間是不可調(diào)和的矛盾,理解這一點對設計滿足性能要求的算法是至關重要的。大型網(wǎng)站性能優(yōu)化的一個關鍵就是使用緩存,而緩存跟上面講的連接池道理非常類似,也是使用空間換時間的策略??梢詫狳c數(shù)據(jù)置于緩存中,當用戶查詢這些數(shù)據(jù)時可以直接從緩存中得到,這無論如何也快過去數(shù)據(jù)庫中查詢。當然,緩存的置換策略等也會對系統(tǒng)性能產(chǎn)生重要影響,對于這個問題的討論已經(jīng)超出了這里要闡述的范圍。

3. 什么是 DAO 模式?

答:DAO(DataAccess Object)顧名思義是一個為數(shù)據(jù)庫或其他持久化機制提供了抽象接口的對象,在不暴露數(shù)據(jù)庫實現(xiàn)細節(jié)的前提下提供了各種數(shù)據(jù)操作。為了建立一個健壯的 Java EE 應用,應該將所有對數(shù)據(jù)源的訪問操作進行抽象化后封裝在一個公共 API 中。

用程序設計語言來說,就是建立一個接口,接口中定義了此應用程序中將會用到的所有事務方法。在這個應用程序中,當需要和數(shù)據(jù)源進行交互的時候則使用這個接口,并且編寫一個單獨的類來實現(xiàn)這個接口,在邏輯上該類對應一個特定的數(shù)據(jù)存儲。DAO 模式實際上包含了兩個模式,一是 Data Accessor(數(shù)據(jù)訪問器),二是 Data Object(數(shù)據(jù)對象),前者要解決如何訪問數(shù)據(jù)的問題,而后者要解決的是如何用對象封裝數(shù)據(jù)。

4. 什么是ORM?

答:對象關系映射(Object-Relational Mapping,簡稱 ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫的關系模型互不匹配問題的技術(shù);簡單的說,ORM 是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)(可以用 XML 或者是注解),將 Java 程序中的對象自動持久化到關系數(shù)據(jù)庫中或者將關系數(shù)據(jù)庫表中的行轉(zhuǎn)換成 Java 對象,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。

5. JDBC 中如何進行事務處理?

答:Connection 提供了事務處理的方法,通過調(diào)用setAutoCommit(false)可以設置手動提交事務;當事務完成后用 commit()顯式提交事務;如果在事務處理過程中發(fā)生異常則通過 rollback() 進行事務回滾。除此之外,較新的 JDBC 標準還引入了Savepoint(保存點)的概念,允許事務回滾到指定的保存點。

6. 事務的 ACID 是指什么?

答:

1)原子性(Atomic):事務中各項操作,要么全做要么全不做,任何一項操作的失敗都會導致整個事務的失??;

2)一致性(Consistent):事務結(jié)束后系統(tǒng)狀態(tài)是一致的;

3)隔離性(Isolated):并發(fā)執(zhí)行的事務彼此無法看到對方的中間狀態(tài);

4)持久性(Durable):事務完成后所做的改動都會被持久化,即使發(fā)生災難性的失敗。通過日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)。

【補充】關于事務,在面試中被問到的概率是很高的,可以問的問題也是很多的。首先需要知道的是,只有存在并發(fā)數(shù)據(jù)訪問時才需要事務。

7. 使用 JDBC 操作數(shù)據(jù)庫時,如何提升讀取數(shù)據(jù)的性能?如何提升更新數(shù)據(jù)的性能?

答:要提升讀取數(shù)據(jù)的性能,可以指定通過結(jié)果集(ResultSet)對象指定每次抓取數(shù)據(jù)的大?。╢etch size);要提升更新數(shù)據(jù)的性能可以使用PreparedStatement語句構(gòu)建批處理(batch)。

8. 存儲過程和函數(shù)的區(qū)別

答:

從參數(shù)的返回情況來看:

如果返回多個參數(shù)值最好使用存儲過程,如果只有一個返回值的話可以使用函數(shù)。

從調(diào)用情況來看:

如果在 SQL 語句(DML 或 SELECT)中調(diào)用的話一定是存儲函數(shù)或存儲的封裝函數(shù)不可以是存儲過程,但調(diào)用存儲函數(shù)的時候還有好多限制以及函數(shù)的純度等級的問題,如果是在過程化語句中調(diào)用的話,就要看你要實現(xiàn)什么樣的功能。函數(shù)一般情況下是用來計算并返回一個計算結(jié)果而存儲過程一般是用來完成特定的數(shù)據(jù)操作(比如修改、插入數(shù)據(jù)庫表或執(zhí)行某些 DDL 語句等等),所以雖然他們的語法上很相似但用戶在使用他們的時候所需要完成的功能大部分情況下是不同的。

9. 你認為在表上建立索引可以提高數(shù)據(jù)庫系統(tǒng)的效率嗎,為什么?

答:不一定

建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對于一個經(jīng)常需要更新和插入的表格,就沒有必要為一個很少使用的 where 子句單獨建立索引了,對于比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

10. 什么是數(shù)據(jù)庫的參照完整性?

答:數(shù)據(jù)庫的參照完整性是指表與表之間的一種對應關系,通常情況下可以通過設置兩表之間的主鍵、外鍵關系,或者編寫兩表的觸發(fā)器來實現(xiàn)。 有對應參照完整性的兩張表格,在對他們進行數(shù)據(jù)插入、更新、刪除的過程中,系統(tǒng)都會將被修改表格與另一張對應表格進行對照,從而阻止一些不正確的數(shù)據(jù)的操作。

11. 如何優(yōu)化數(shù)據(jù)庫,如何提高數(shù)據(jù)庫的性能?

答:

1)硬件調(diào)整性能 最有可能影響性能的是磁盤和網(wǎng)絡吞吐量,解決辦法擴大虛擬內(nèi)存,并保證有足夠可以擴充的空間;把數(shù)據(jù)庫服務器上的不必要服務關閉掉;把數(shù)據(jù)庫服務器和主域服務器分開;把 SQL 數(shù)據(jù)庫服務器的吞吐量調(diào)為最大;在具有一個以上處理器的機器上運行 SQL 。

2)調(diào)整數(shù)據(jù)庫

若對該表的查詢頻率比較高,則建立索引;建立索引時,想盡對該表的所有查詢搜索操作, 按照 where 選擇條件建立索引,盡量為整型鍵建立為有且只有一個簇集索引,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁上,縮短查找范圍,為在查詢經(jīng)常使用的全部列建立非簇集索引,能最大地覆蓋查詢;但是索引不可太多,執(zhí)行 UPDATE DELETE INSERT 語句需要用于維護這些索引的開銷量急劇增加;避免在索引中有太多的索引鍵;避免使用大型數(shù)據(jù)類型的列為索引;保證每個索引鍵值有少數(shù)行。

3)使用存儲過程

應用程序的實現(xiàn)過程中,能夠采用存儲過程實現(xiàn)的對數(shù)據(jù)庫的操作盡量通過存儲過程來實現(xiàn),因為存儲過程是存放在數(shù)據(jù)庫服務器上的一次性被設計、編碼、測試,并被再次使用,需要執(zhí)行該任務的應用可以簡單地執(zhí)行存儲過程,并且只返回結(jié)果集或者數(shù)值,這樣不僅可以使程序模塊化,同時提高響應速度,減少網(wǎng)絡流量,并且通過輸入?yún)?shù)接受輸入,使得在應用中完成邏輯的一致性實現(xiàn)。

4)應用程序結(jié)構(gòu)和算法

建立查詢條件索引僅僅是提高速度的前提條件,響應速度的提高還依賴于對索引的使用。因為人們在

使用SQL時往往會陷入一個誤區(qū),即太關注于所得的結(jié)果是否正確,特別是對數(shù)據(jù)量不是特別大的數(shù)據(jù)庫操作時,是否建立索引和使用索引的好壞對程序的響應速度并不大,因此程序員在書寫程序時就忽略了不同的實現(xiàn)方法之間可能存在的性能差異,這種性能差異在數(shù)據(jù)量特別大時或者大型的或是復雜的數(shù)據(jù)庫環(huán)境中(如聯(lián)機事務處理 OLTP 或決策支持系統(tǒng) DSS )中表現(xiàn)得尤為明顯。在工作實踐中發(fā)現(xiàn),不良的 SQL 往往來自于不恰當?shù)乃饕O計、不充份的連接條件和不可優(yōu)化的 where 子句。在對它們進行適當?shù)膬?yōu)化后,其運行速度有了明顯地提高!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容