在企業(yè)級(jí)應(yīng)用系統(tǒng)中, 一個(gè)好的數(shù)據(jù)訪問(wèn)層的設(shè)計(jì)會(huì)對(duì)整個(gè)系統(tǒng)的性能帶來(lái)很大影響摔笤。根據(jù)Appdynamics1的統(tǒng)計(jì):
超過(guò)一半的的應(yīng)用的性能瓶頸來(lái)自于數(shù)據(jù)庫(kù).
數(shù)據(jù)有很多種不同的格式(表行,索引節(jié)點(diǎn))花颗,并且數(shù)據(jù)庫(kù)記錄會(huì)被多個(gè)并發(fā)用戶讀寫(xiě)。從并發(fā)角度而言甫窟,這是很具挑戰(zhàn)性的任務(wù)瑞筐。為了能強(qiáng)化數(shù)據(jù)訪問(wèn)層,數(shù)據(jù)訪問(wèn)邏輯必須與底層數(shù)據(jù)庫(kù)很好地配合随橘。
一個(gè)典型的RDBMS(關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))數(shù)據(jù)訪問(wèn)層掌握很多技術(shù)喂分,最弱的技術(shù)會(huì)限制整個(gè)企業(yè)級(jí)解決方案。在進(jìn)入更高級(jí)抽象層(比如ORM框架)前必須先精通底層技術(shù)机蔗。
1.1 數(shù)據(jù)庫(kù)服務(wù)器與連通層
數(shù)據(jù)庫(kù)手冊(cè)不僅僅只是給數(shù)據(jù)庫(kù)管理員用的蒲祈。與數(shù)據(jù)庫(kù)打交道但是卻不知道它的原理甘萧,就跟無(wú)照駕駛是一樣的。是否熟悉SQL標(biāo)準(zhǔn)和數(shù)據(jù)庫(kù)特性是構(gòu)建高性能應(yīng)用的關(guān)鍵梆掸。
某些高效的特性因?yàn)椴荒茉俨煌臄?shù)據(jù)庫(kù)間通用扬卷,由于害怕數(shù)據(jù)庫(kù)的一致性從而會(huì)避免使用這些技術(shù)。實(shí)際上酸钦,更常見(jiàn)的是維持使用一個(gè)低效的數(shù)據(jù)庫(kù)層怪得,而不是去使用一個(gè)新的數(shù)據(jù)庫(kù)解決方案。
所有的數(shù)據(jù)訪問(wèn)都依賴(lài)于JDBC API去和數(shù)據(jù)庫(kù)服務(wù)器通信卑硫。JDBC提供了很多性能優(yōu)化技術(shù)徒恋,旨在降低事務(wù)響應(yīng)時(shí)間、容納更多的訪問(wèn)欢伏。
因此本書(shū)的第一部分將專(zhuān)注于JDBC入挣,并且會(huì)講到連接管理、Statement批量操作硝拧、Result結(jié)果集的讀取和數(shù)據(jù)庫(kù)事務(wù)的核心径筏。
1.2 應(yīng)用程序數(shù)據(jù)訪問(wèn)層
在企業(yè)級(jí)應(yīng)用中有一些已經(jīng)被證實(shí)有效的模式。Martin Fowler的《企業(yè)應(yīng)用架構(gòu)模式》是每一個(gè)企業(yè)應(yīng)用開(kāi)發(fā)者都應(yīng)該閱讀的障陶。獨(dú)立于對(duì)象關(guān)系映射模型滋恬,許多ORM框架都應(yīng)用了很多模式,例如Unit of Work, Identity Map, Lazy Loading, Embedded
Value, Entity Inheritance or Optimistic and Pessimistic Locking抱究。
1.2.1 ORM框架
ORM工具也可以加快應(yīng)用開(kāi)發(fā)速度恢氯,但是學(xué)習(xí)曲線毫無(wú)疑問(wèn)是陡峭的。要掌握將關(guān)系型數(shù)據(jù)和領(lǐng)域模型連接的復(fù)雜的內(nèi)在關(guān)系媳维,唯一的辦法就是在使用的過(guò)程中去了解它酿雪。
有時(shí)候即使說(shuō)明文檔都不一定夠,為了解決一些性能相關(guān)的問(wèn)題侄刽,不可避免地需要了解其源碼指黎。JPA擅于寫(xiě)數(shù)據(jù)是因?yàn)樵诔志没瘜?duì)象變化時(shí)所有DML語(yǔ)句會(huì)被自動(dòng)執(zhí)行。這樣就可以加快迭代開(kāi)發(fā)過(guò)程州丹。
本書(shū)第二部分會(huì)介紹各種Hibernate特有的優(yōu)化技術(shù)醋安,例如id生成器、高效實(shí)體提取墓毒、狀態(tài)轉(zhuǎn)換吓揪、應(yīng)用級(jí)事務(wù)和實(shí)體緩存。
1.2.2 原生查詢構(gòu)造器框架
JPA和Hibernate不是為了去取代SQL的所计。在一些應(yīng)用中原生的SQL查詢是不可避免的柠辞。JPA將普通的對(duì)象檢索進(jìn)行抽象,但是當(dāng)某些讀取和處理數(shù)據(jù)的時(shí)候主胧,沒(méi)有什么能比SQL更方便叭首。
JPQL(Java Persistence Querying Language)將不同的數(shù)據(jù)庫(kù)的查詢規(guī)范進(jìn)行了抽象习勤,對(duì)上提供統(tǒng)一的API。因此它缺乏對(duì)某些特有功能的支持焙格,例如Window Functions图毕、Common Table Expressions、Derived tables和PIVOT眷唉。與JPA相反予颤,jOOQ(Java Object Oriented Query)對(duì)數(shù)據(jù)庫(kù)的特性支持非常好。它提供的類(lèi)型安全的查詢構(gòu)造器可以防止應(yīng)用遭受SQL注入攻擊冬阳。
因此蛤虐,本書(shū)第三部分會(huì)介紹使用jOOQ進(jìn)行高級(jí)查詢的技術(shù)。
關(guān)于數(shù)據(jù)庫(kù)性能基準(zhǔn)測(cè)試
本書(shū)中很多用于證明性能相對(duì)提升的基準(zhǔn)測(cè)試摩泪“恃妫基準(zhǔn)測(cè)試的結(jié)果通常依賴(lài)于底層硬件劫谅、操作系統(tǒng)或者數(shù)據(jù)庫(kù)服務(wù)器配置见坑、數(shù)據(jù)大小和并發(fā)模式。因此捏检,性能的絕對(duì)值沒(méi)有相對(duì)值重要荞驴。最相關(guān)的基準(zhǔn)測(cè)試結(jié)果其實(shí)就是相對(duì)于實(shí)際生產(chǎn)系統(tǒng)的。
為了防止讀者根據(jù)基準(zhǔn)測(cè)試來(lái)比較兩個(gè)不同的數(shù)據(jù)庫(kù)從而得到一個(gè)錯(cuò)誤的結(jié)論贯城,書(shū)中會(huì)把數(shù)據(jù)庫(kù)的名稱(chēng)模糊地記做DB_A熊楼,DB_B,DB_C和DB_D能犯。
本書(shū)中所使用的所有示例的源碼都在GitHub鲫骗。