使用NoSQL实现实体服务–第3部分:CouchDB
正如我在第1部分中已經(jīng)提到的那樣,我已經(jīng)選擇CouchDB作為我的NoSQL數(shù)據(jù)庫,選擇Ektorp庫作為數(shù)據(jù)庫驅(qū)動程序。
CouchDB –輕松數(shù)據(jù)庫。
CouchDB本質(zhì)上將充當(dāng)我的文檔存儲。 它本身以JSON格式 (我認為實際上是稱為BSON的二進制版本)存儲其文檔,并且不需要對文檔的結(jié)構(gòu)有先驗知識。 您幾乎可以存儲任何內(nèi)容,甚至可以在同一數(shù)據(jù)庫中混合使用不同類型的文檔。
由于沒有諸如DDL腳本或XSD架構(gòu)之類的先前設(shè)置步驟,因此上手可能很快。 實際上,如果您可以使用CURL,則無需任何操作,只需向CouchDB發(fā)出HTTP命令即可存儲您的東西。 就像它說的那樣-CouchDB相當(dāng)輕松。 有關(guān)CouchDB基礎(chǔ)入門的完整說明,請參閱CouchDB:權(quán)威指南 。
從Java到JSON格式。
當(dāng)然,當(dāng)我們使用Java時,JSON作為基于String的表示形式使用起來并不方便。 這是Ektorp介入的地方,使用Jackson Java-to-JSON庫使事情順利進行。 Jackson促進了Ektorp幕后的開箱即用POJO到JSON轉(zhuǎn)換過程。
Jackson是該項目的重要功能,因為我想實現(xiàn)從XML到Java對象再到數(shù)據(jù)庫文檔然后再返回的干凈,無憂的開發(fā)流程。 杰克遜是完成這項工作的關(guān)鍵組成部分,我們將在后面看到。
CouchDB的文檔存儲先決條件。
盡管CouchDB不需要模式,但每個文檔確實需要兩個基本數(shù)據(jù):唯一ID和文檔修訂號。 這些數(shù)據(jù)項有助于管理文檔和實現(xiàn)冪等規(guī)則,以幫助維護多用戶環(huán)境中的文檔完整性。 CouchDB希望將這些字段命名為'_id'和'_revision' 。 _id可以在創(chuàng)建操作期間由用戶或數(shù)據(jù)庫分配。 _revision由數(shù)據(jù)庫分配,每次文檔記錄更新時,_revision都會遞增。
現(xiàn)在顯然我不希望將特定于數(shù)據(jù)庫的字段放入XML文檔中,因此我對產(chǎn)品的定義有一個名為“ Id”的字段和一個名為“ Revision”的字段。 除非我做任何事情,否則該文檔將無法滿足在CouchDB中存儲的必要條件,并且奇怪的事情將開始發(fā)生,例如在運行時將額外的_id和_revision字段添加到數(shù)據(jù)庫記錄中,而這些字段與Id和Revision不匹配。我要求CouchDB存儲XML文檔。 我不想為了添加這些數(shù)據(jù)庫特定字段而更改產(chǎn)品的XML模式,該怎么辦?
聰明地,可以將Jackson配置為糾正此問題,而無需觸碰從Product XML架構(gòu)派生的“ Product”對象的Java / JaxB定義。 可以說在運行時將產(chǎn)品的“ Id”和“修訂”字段重新映射到CouchDb的“ _id”和“ _revision”字段。 這樣可以保持一定程度的松散耦合,但是允許我在我的代碼中使用相同的JaxB生成的Java對象,從而節(jié)省了大量的時間和精力。
訪問數(shù)據(jù)庫。
CouchDB無法通過JDBC訪問,并且沒有傳統(tǒng)的JDBC驅(qū)動程序。 相反,它使用REST接口(基于HTTP的GET,PUT,POST,DELETE等),并使用JSON格式的內(nèi)容進行通信。
Ektorp提供了一些幫助程序類,以幫助您使用CouchDB數(shù)據(jù)庫。 有一個可實例化的Connector類可建立與數(shù)據(jù)庫的可行連接,還有一個可定制的RepositorySupport類,該類提供了用于與數(shù)據(jù)庫及其記錄進行交互的類型安全的便捷方法。
創(chuàng)建一個DAO。
通過擴展名和類類型正確自定義后,RepositorySupport類就可以用于您的所有基本數(shù)據(jù)訪問對象要求,例如Get,Create,Update和Remove操作。 它也可以純粹基于您添加到其中的方法的名稱自動生成CouchDB視圖(只要它們遵循某些規(guī)則)。 這樣可以輕松地向您的DAO添加“查找”方法,例如“ findByManufacturerName”或“ findByCategoryId”。 最后,如果您需要更復(fù)雜的視圖或映射/減少查詢,它也可以為您提供幫助。
全部拉在一起。
通過配置Jackson并使用Ektorp創(chuàng)建DAO,現(xiàn)在只是編寫一些集成測試以確保所有內(nèi)容都可以在一起的一種情況。 我最初使用的測試非常簡單,我要求DAO進行...
如果DAO代碼可以完成所有這些事情,那么我具有產(chǎn)品實體服務(wù)實現(xiàn)所需的基本行為。 但是,由于這是一個集成測試,因此我需要在測試周期中可用的CouchDB服務(wù)。 Maven可以通過使用Maven Failsafe插件將此類測試綁定到Maven構(gòu)建生命周期的特定部分進行集成測試來幫助進行集成測試。 這樣可以避免將集成測試與通常具有較少依賴性和運行時要求的普通單元測試混在一起。
使CouchDB在本地工作非常簡單,但是如果您不必為安裝和設(shè)置過程所困擾,也可以使用免費的云托管CouchDB開發(fā)實例 。 我都嘗試過,并且它們同樣工作良好。
下一步是什么?
現(xiàn)在,我的CouchDB DAO已完成,是時候進入項目的最后階段了,我將把DAO行為鏈接到我先前創(chuàng)建的Web Service功能。 為此,我將使用Java Enterprise Edition 6。
如果您希望在下一期出版物發(fā)布時收到電子郵件通知,請單擊右側(cè)的鏈接進行訂閱。
繼續(xù)第4部分 。
參考: 使用NoSQL實施實體服務(wù)–第3部分:我們的JCG合作伙伴 Ben Wilcock的CouchDB ,位于SOA,BPM,Agile和Java博客上。
翻譯自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_6090.html
總結(jié)
以上是生活随笔為你收集整理的使用NoSQL实现实体服务–第3部分:CouchDB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 食品原料备案在卫生局还是市场局(食品原料
- 下一篇: linux查看cpu核数和内存大小(li