5種Java數(shù)據(jù)計(jì)算層的解決方法
JAVA的數(shù)據(jù)計(jì)算層主要是為了降低應(yīng)用程序?qū)雍蛿?shù)據(jù)持久層之間的耦合性,分擔(dān)它們的計(jì)算壓力。它應(yīng)當(dāng)符合如下特征:
5種java數(shù)據(jù)計(jì)算層的解決方法
1. 可以統(tǒng)一的計(jì)算來自任意數(shù)據(jù)持久層的數(shù)據(jù),不僅包括數(shù)據(jù)庫,也包括非數(shù)據(jù)庫的Excel/Txt/XML。其中對最常見的結(jié)構(gòu)化數(shù)據(jù)的計(jì)算是重點(diǎn)。
2. 可以統(tǒng)一的進(jìn)行不同種類數(shù)據(jù)源之間的相互計(jì)算。不僅包括異種數(shù)據(jù)庫之間,也包括數(shù)據(jù)庫和非數(shù)據(jù)庫之間的計(jì)算。
3. 數(shù)據(jù)庫和計(jì)算層、計(jì)算層和JAVA代碼之間要有盡量低的耦合性,可以方便移植。
4. 可以是非JAVA架構(gòu),但必須能和JAVA方便的集成。
5. 要有較高的開發(fā)效率,包括腳本編寫,可讀性,調(diào)試,日常維護(hù)。
6. 復(fù)雜計(jì)算目標(biāo)和大數(shù)據(jù)計(jì)算是流行趨勢,數(shù)據(jù)計(jì)算層應(yīng)該能直接支持。
考察了5種數(shù)據(jù)計(jì)算層:Hibernate,集算器,SQL,iBatis,R languae。考察的指標(biāo)包括:成熟度、低耦合性、腳本編寫、集成、界面友好性、性能、復(fù)雜計(jì)算、大數(shù)據(jù)支持、非數(shù)據(jù)庫計(jì)算、跨庫計(jì)算、調(diào)試方便性。
Hibernate
Hibernate是輕量級的ORM框架,由Gavin King創(chuàng)造,現(xiàn)在屬于JBOSS。它是非分布式環(huán)境中(intranet)中優(yōu)秀的數(shù)據(jù)計(jì)算層。它具有徹底的基于對象的訪問方式,而集算器和iBatis只能算半對象或類對象。
Hibernate幾乎做到了計(jì)算腳本、JAVA代碼、數(shù)據(jù)庫之間的徹底解耦。但計(jì)算能力不足使它仍然在很多地方依靠SP/SQL,這是個(gè)尷尬的問題。
另外EJB的JPA屬于數(shù)據(jù)計(jì)算層協(xié)議,但考慮到Hibernate是實(shí)際上的JPA,所以不介紹它了。
成熟度:4星。經(jīng)過10多年的市場檢驗(yàn),Hibernate已經(jīng)非常成熟。
低耦合性:4星,這是Hibernate出現(xiàn)的原因。但本地SQL仍然是不可避免的,難以完美移植。
腳本編寫:2星。Hibernate的計(jì)算方式是對象引用和HQL,前者最容易,給5星;但后者的學(xué)習(xí)難度比SQL高,而且調(diào)試極困難,開發(fā)效率不如SQL,2星;另外有些計(jì)算還是不得不依靠SQL,2種語言混用,困難,給2星。平均3星。
集成:2星。Hibernate是純java架構(gòu),只需要復(fù)制jar包和N個(gè)映射文件,并利用好session,入門比較容易。但駕馭Hibernate的緩存是必修課,這需要極高的架構(gòu)設(shè)計(jì)能力,不建議普通程序員接觸。當(dāng)然,ORM的這種天生的缺陷在其他數(shù)據(jù)計(jì)算層并不存在。
界面友好性:0星。Hibernate有對象生成器;但缺乏最重要的HQL圖形化設(shè)計(jì)界面,等于沒有GUI。
性能:3星。支持3級緩存,雖然一定不如SQL,但據(jù)我個(gè)人經(jīng)驗(yàn)其綜合性能達(dá)到了SQL的60%。
復(fù)雜計(jì)算:0星。不支持復(fù)雜計(jì)算。需要依靠SQL/外部工具實(shí)現(xiàn)。
大數(shù)據(jù)支持:1星。不直接支持hadoop架構(gòu),但有人在研究。
非數(shù)據(jù)庫計(jì)算:0星。不直接支持非數(shù)據(jù)庫的計(jì)算。
跨庫計(jì)算:0星。不直接支持庫間的計(jì)算。每個(gè)HQL只支持單庫。
調(diào)式方便性:0星。很難調(diào)試,對程序員來講,這是致命的。
集算器
集算器是最近出現(xiàn)的新型JAVA計(jì)算層,擅長復(fù)雜的、跨庫的計(jì)算。和其他數(shù)據(jù)計(jì)算層不同,集算器只是將SQL作為一種數(shù)據(jù)源,而取到數(shù)據(jù)后的計(jì)算則完全和SQL無關(guān)。PJA/hibernate則被迫開放SQL接口,用來實(shí)現(xiàn)自己處理不了的計(jì)算。
成熟度:1星。在市場出現(xiàn)僅1年,應(yīng)用的廣度和深度都不如其他數(shù)據(jù)計(jì)算層。
低耦合性:4星。腳本獨(dú)立于數(shù)據(jù)庫和Java代碼,算法和具體數(shù)據(jù)庫無關(guān),耦合性低。可以輕松移植到不同的數(shù)據(jù)庫。因?yàn)檩敵鼋涌跒镴DBC,所以也可以輕松移植到報(bào)表,這是其他數(shù)據(jù)計(jì)算層所不具備的特征。
腳本編寫:4星。腳本寫在網(wǎng)格中,單元格可以按格名調(diào)用,可以直接觀察每一步的計(jì)算結(jié)果,復(fù)雜目標(biāo)可以分解為簡單步驟。但它的語法偏向?qū)ο笠?但不是對象),與偏向描述語句的SQL風(fēng)格不同,需要學(xué)習(xí)。不過JAVA程序員到底喜歡哪一種,還很難說。
集成:5星。集算器是純JAVA架構(gòu),輸出JDBC接口,集成不需要學(xué)習(xí)。用過任何一種數(shù)據(jù)庫的程序員都可以無障礙使用。
界面友好性:4星。獨(dú)立的圖形化編輯器,使用方便直觀。但幫助系統(tǒng)不夠友好。
性能:2星。全內(nèi)存計(jì)算,數(shù)據(jù)量不能太大。
復(fù)雜計(jì)算:5星。這是集算器出現(xiàn)的原因。
非數(shù)據(jù)庫計(jì)算:3星。支持Excel/Txt,但不支持xml或webService.
大數(shù)據(jù)支持:4星。能訪問HDFS,同步宣稱支持并行計(jì)算,但細(xì)節(jié)還不太了解。
跨庫計(jì)算:5星。集算器語法與具體數(shù)據(jù)庫無關(guān),天生支持跨庫計(jì)算。
調(diào)式方便性:5星。調(diào)式功能完善,而且使用非常方便,可以觀察到最細(xì)粒度的計(jì)算步驟。其他數(shù)據(jù)計(jì)算層遠(yuǎn)遠(yuǎn)達(dá)不到這種方便性。
SQL
SQL/SP/JDBC在這里屬于一類,這是老牌的數(shù)據(jù)計(jì)算層,性能和靈活性是它的優(yōu)勢。但隨著新情況的不斷出現(xiàn),單純用SQL已經(jīng)難以滿足需求,比如: JAVA開發(fā)規(guī)模的擴(kuò)大,數(shù)據(jù)量的劇增,復(fù)雜計(jì)算問題的涌現(xiàn)。雖然SQL得高分的指標(biāo)不多,但都是權(quán)重最高的。
成熟度:5星。最成熟的。
低耦合性:0星。耦合性極高。除了在實(shí)驗(yàn)室之外,幾乎不可能寫出與數(shù)據(jù)庫無關(guān),與代碼無關(guān)的計(jì)算腳本。
腳本編寫:3星。SQL實(shí)際很難寫出也很難維護(hù),需要大量的時(shí)間去學(xué)習(xí),好在SQL非常成熟,資料豐富論壇很多。但各種數(shù)據(jù)之間的不兼容也是個(gè)巨大的障礙,這是Hibernate之所以流行的主因。
集成:5星。JAVA程序員的第一課就是用JDBC連接數(shù)據(jù)庫。
界面友好性:5星。有大量的SQL開發(fā)工具,成熟度都很高,我自己用過不下10種。
性能:5星。數(shù)據(jù)庫直接支持的語言,性能最高。
復(fù)雜計(jì)算:3星。SQL適合普通的計(jì)算問題,可以解決復(fù)雜問題但非常困難(而Hibernate是完全不能)。SP的出現(xiàn)并不能有太大的改善。代碼難以拆分,復(fù)雜目標(biāo)難以分解為簡單步驟是主因。
大數(shù)據(jù)支持:1星。個(gè)別數(shù)據(jù)庫廠商表示已經(jīng)支持大數(shù)據(jù)了,但這讓SQL語句的不兼容程度加劇了,而且我也沒見過成功案例。
非數(shù)據(jù)庫計(jì)算:1星。不直接支持。采用ETL/數(shù)據(jù)倉庫可以達(dá)到這個(gè)目的,但代價(jià)巨大。
跨庫計(jì)算:1星。個(gè)別數(shù)據(jù)庫支持,但性能較差,也可以采用DBLink和link server等中間件勉強(qiáng)支持,但離“自由方便”的程度還差得遠(yuǎn)。
調(diào)式方便性:1星。很難調(diào)試,難以觀察中間結(jié)果,只能全部執(zhí)行完才能看到最終計(jì)算結(jié)果。唯一的辦法是“以調(diào)試為目標(biāo)進(jìn)行編程”,即刻意建造大量臨時(shí)表。
iBatis:
簡單敏捷因此強(qiáng)大的數(shù)據(jù)計(jì)算層。和Hibernate不同,它鼓勵(lì)寫SQL,所以學(xué)習(xí)成本最低。同時(shí)它用最小的代價(jià)實(shí)現(xiàn)了計(jì)算腳本和JAVA代碼的解耦,只用20%的代價(jià)就實(shí)現(xiàn)了hibernate 80%的功能。另外沒實(shí)現(xiàn)的20%是計(jì)算腳本和數(shù)據(jù)庫的解耦。
復(fù)雜計(jì)算環(huán)境是它的弱項(xiàng),比如:分布式計(jì)算、復(fù)雜計(jì)算、非數(shù)據(jù)庫計(jì)算、跨庫計(jì)算。
成熟度:4星。iBatis經(jīng)過了十幾年市場的考驗(yàn),是我最喜歡的框架之一。但對緩存的支持不足仍然是缺陷。
低耦合性:2星。SQL可以無縫替換,但仍然是針對具體數(shù)據(jù)庫的SQL。事實(shí)上后者是數(shù)據(jù)庫的問題,廠商要粘住客戶,所以SQL不兼容,讓你難以遷移;但程序員不愿讓粘住,非要遷移。
腳本編寫:3星。它就是SQL。
集成:4星。基本沒有難度,初學(xué)者半天時(shí)間都可以熟練掌握。
界面友好性:4星。沒有圖形化計(jì)算過程設(shè)計(jì)界面,但可以借用SQL工具。
性能:3星。性能比SQL略低,主要是resultSet和map/list之間轉(zhuǎn)化需要多花費(fèi)一點(diǎn)時(shí)間。另外緩存支持不如hibernate好。綜合比起來兩者區(qū)別不大。其實(shí)我認(rèn)為引入ORM的同時(shí)引入性能問題就是失敗的。
復(fù)雜計(jì)算:3星。同SQL,比hibernate強(qiáng)。
大數(shù)據(jù)支持:1星。同SQL
非數(shù)據(jù)庫計(jì)算:1星。同SQL
跨庫計(jì)算:1星。同SQL
調(diào)式方便性:1星。同SQL
R語言
R語言不易和JAVA集成,但強(qiáng)大的計(jì)算能力和廣泛的社區(qū)支持,以及大數(shù)據(jù)的特性使我不得不提到它。另外跨庫的計(jì)算、非數(shù)據(jù)庫的計(jì)算、模型計(jì)算也是它的強(qiáng)項(xiàng)。當(dāng)然,在各種數(shù)據(jù)計(jì)算層中,它也是最難學(xué)習(xí)的。
成熟度:5星。R語言的歷史僅次于SQL。無數(shù)的社區(qū)在熱烈討論R。尤其是大數(shù)據(jù)時(shí)代。
低耦合性:4星。R語言和集算器在這方面沒區(qū)別。
腳本編寫:3星。這方面R和集算器很像,區(qū)別是集算器更敏捷代碼更靈活,對結(jié)構(gòu)化數(shù)據(jù)的支持更專業(yè),而R內(nèi)置了大量模型算法。所以基本持平。
集成:1星。R不是JAVA架構(gòu),很難集成進(jìn)JAVA,本來性能就不高,集成后性能更是大幅度降低。
界面友好性:3星。有專門的IDE界面,但很粗糙,實(shí)際價(jià)值不大,這也是開源產(chǎn)品的通病。
性能:2星。全內(nèi)存運(yùn)算,難以應(yīng)付大數(shù)據(jù)量。
復(fù)雜計(jì)算:5星。同集算器類似。
大數(shù)據(jù)支持:3星。有R與Hadoop的結(jié)合機(jī)制,但JAVA體系與非JAVA體系之間的結(jié)合并不容易,性能損失較大。
非數(shù)據(jù)庫計(jì)算:5星。同集算器類似。
跨庫計(jì)算:5星。同集算器類似。
調(diào)式方便性:2星。勉強(qiáng)算有調(diào)試功能,但很不專業(yè)。


2009-03-04 10:38:36




