使用NoSQL實現實體服務–第3部分:CouchDB

在本系列的第2部分中 ,我使用SOA的“合同優先”技術創建和部署了產品實體服務,現在,我將致力于服務實現的NoSQL數據庫方面。

正如我在第1部分中已經提到的那樣,我已經選擇CouchDB作為我的NoSQL數據庫,選擇Ektorp庫作為數據庫驅動程序。

CouchDB –輕松數據庫。

CouchDB本質上將充當我的文檔存儲。 它本身以JSON格式 (我認為實際上是稱為BSON的二進制版本)存儲其文檔,并且不需要對文檔的結構有先驗知識。 您幾乎可以存儲任何內容,甚至可以在同一數據庫中混合使用不同類型的文檔。

由于沒有諸如DDL腳本或XSD架構之類的先前設置步驟,因此上手可能很快。 實際上,如果您可以使用CURL,則無需任何操作,只需向CouchDB發出HTTP命令即可存儲您的東西。 就像它說的那樣-CouchDB相當輕松。 有關CouchDB基礎入門的完整說明,請參閱CouchDB:權威指南 。

從Java到JSON格式。

當然,當我們使用Java時,JSON作為基于String的表示形式使用起來并不方便。 這是Ektorp介入的地方,使用Jackson Java-to-JSON庫使事情順利進行。 Jackson促進了Ektorp幕后的開箱即用POJO到JSON轉換過程。

Jackson是該項目的重要功能,因為我想實現從XML到Java對象再到數據庫文檔然后再返回的干凈,無憂的開發流程。 杰克遜是完成這項工作的關鍵組成部分,我們將在后面看到。

CouchDB的文檔存儲先決條件。

盡管CouchDB不需要模式,但每個文檔確實需要兩個基本數據:唯一ID和文檔修訂號。 這些數據項有助于管理文檔和實現冪等規則,以幫助維護多用戶環境中的文檔完整性。 CouchDB希望將這些字段命名為'_id''_revision' 。 _id可以在創建操作期間由用戶或數據庫分配。 _revision由數據庫分配,每次文檔記錄更新時,_revision都會遞增。

現在顯然我不希望將特定于數據庫的字段放入XML文檔中,因此我對產品的定義有一個名為“ Id”的字段和一個名為“ Revision”的字段。 除非我做任何事情,否則該文檔將無法滿足在CouchDB中存儲的必要條件,并且奇怪的事情將開始發生,例如在運行時將額外的_id和_revision字段添加到數據庫記錄中,而這些字段與Id和Revision不匹配。我要求CouchDB存儲XML文檔。 我不想為了添加這些數據庫特定字段而更改產品的XML模式,該怎么辦?

聰明地,可以將Jackson配置為糾正此問題,而無需觸碰從Product XML架構派生的“ Product”對象的Java / JaxB定義。 可以說在運行時將產品的“ Id”和“修訂”字段重新映射到CouchDb的“ _id”和“ _revision”字段。 這樣可以保持一定程度的松散耦合,但是允許我在我的代碼中使用相同的JaxB生成的Java對象,從而節省了大量的時間和精力。

訪問數據庫。

CouchDB無法通過JDBC訪問,并且沒有傳統的JDBC驅動程序。 相反,它使用REST接口(基于HTTP的GET,PUT,POST,DELETE等),并使用JSON格式的內容進行通信。

Ektorp提供了一些幫助程序類,以幫助您使用CouchDB數據庫。 有一個可實例化的Connector類可建立與數據庫的可行連接,還有一個可定制的RepositorySupport類,該類提供了用于與數據庫及其記錄進行交互的類型安全的便捷方法。

創建一個DAO。

通過擴展名和類類型正確自定義后,RepositorySupport類就可以用于您的所有基本數據訪問對象要求,例如Get,Create,Update和Remove操作。 它也可以純粹基于您添加到其中的方法的名稱自動生成CouchDB視圖(只要它們遵循某些規則)。 這樣可以輕松地向您的DAO添加“查找”方法,例如“ findByManufacturerName”或“ findByCategoryId”。 最后,如果您需要更復雜的視圖或映射/減少查詢,它也可以為您提供幫助。

全部拉在一起。

通過配置Jackson并使用Ektorp創建DAO,現在只是編寫一些集成測試以確保所有內容都可以在一起的一種情況。 我最初使用的測試非常簡單,我要求DAO進行...

  1. 創建一個新的JaxB產品對象并為其分配一個ID
  2. 將其保存到我的CouchDB“產品”數據庫中
  3. 使用ID從“產品”數據庫中讀取產品對象
  4. 修改并更新產品對象
  5. 再次檢索它,檢查版本是否增加
  6. 最后, 刪除產品對象并檢查現在嘗試讀取它的操作是否失敗

如果DAO代碼可以完成所有這些事情,那么我具有產品實體服務實現所需的基本行為。 但是,由于這是一個集成測試,因此我需要在測試周期中可用的CouchDB服務。 Maven可以通過使用Maven Failsafe插件將此類測試綁定到Maven構建生命周期的特定部分進行集成測試來幫助進行集成測試。 這樣可以避免將集成測試與通常具有較少依賴性和運行時要求的普通單元測試混在一起。

使CouchDB在本地工作非常簡單,但是如果您不必為安裝和設置過程所困擾,也可以使用免費的云托管CouchDB開發實例 。 我都嘗試過,并且它們同樣工作良好。

下一步是什么?

現在,我的CouchDB DAO已完成,是時候進入項目的最后階段了,我將把DAO行為鏈接到我先前創建的Web Service功能。 為此,我將使用Java Enterprise Edition 6。

如果您希望在下一期出版物發布時收到電子郵件通知,請單擊右側的鏈接進行訂閱。

繼續第4部分 。

參考: 使用NoSQL實施實體服務–第3部分:我們的JCG合作伙伴 Ben Wilcock的CouchDB ,位于SOA,BPM,Agile和Java博客上。


翻譯自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_6090.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8、SpringCloud高頻面試題-版本1

1、SpringCloud組件有哪些 SpringCloud 是一系列框架的有序集合。它利用 SpringBoot 的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用 SpringBoot 的開發風格做到一鍵啟…

java對象不會被改變_Java 并發編程(二)對象的不變性和安全的公布對象

二、安全公布到眼下為止,我們重點討論的是怎樣確保對象不被公布,比如讓對象封閉在線程或還有一個對象的內部。當然,在某些情況下我們希望在多個線程間共享對象,此時必須確保安全地進行共享。然而,假設僅僅是像以下程序…

nginx 上php不可寫解決方法

在php.ini中設置的session.save_path會被php-fpm.conf中覆蓋 打開php-fpm.conf文件找到php_value[session.save_apth] 這里的/var/lib/php/session 為實際的session保存目錄,設置為777,必須讓其他用戶有rw權限,因為php在Linux里面以其他用戶身份運行(匿名…

JavaOne 2012:Java策略主題演講和IBM主題演講

與 JavaOne 2010 相似,我對JavaOne 2012的開始也很艱難。由于“計算機和打印機技術上的困難”,辦理登機手續的人花了70分鐘為我提供JavaOne徽章。 盡管我不是世界上最有耐心的人,但比等待更令人失望的是,我錯過了參加“社區會議&a…

java citymap_Java實現Map集合二級聯動

Map集合可以保存鍵值映射關系,這非常適合本實例所需要的數據結構,所有省份信息可以保存為Map集合的鍵,而每個鍵可以保存對應的城市信息,本實例就是利用Map集合實現了省市級聯選擇框,當選擇省份信息時,將改變…

【NIO】之IO和NIO的區別

在Java1.4之前的版本,Java對I/O的支持并不完善,開發人員在開發高性能I/O程序的時候,會面臨以下幾個問題: 1、沒有數據緩存區,I/O性能存在問題 2、沒有C/C通道的概念,輸入和輸出流是相互獨立的不能復用 3、同…

Mono環境下訪問SSL

由于MONO沒有CA證書,所以訪問SSL鏈接(HTTPS)就會出錯,這時候只要強制訪問就可以。 using System.Net.Security;using System.Security.Authentication;using System.Security.Cryptography.X509Certificates; private static bool…

JavaOne 2012:使用HTML5和Java構建移動應用程序

我返回了Parc 55 (任務會議室),觀看Max Katz的( Exadel開發人員關系)“用HTML5和Java構建移動應用程序” Bird-of-Feather(BoF)演示。 具體來說,Katz在Tiggzi (基于云的應…

HDU 2602.Bone Collector-動態規劃0-1背包

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 85530 Accepted Submission(s): 35381 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

java線程實現排序_【多線程實現快速排序】

快速排序算法實現文件QuickSort.javapackage quick.sort;import java.util.concurrent.Callable;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class QuickSort implements Callable{private int[] array;private final in…

使用Gitolite搭建Gitserver

Gitolite是一款Perl語言開發的Git服務管理工具。通過公鑰對用戶進行認證。并可以通過配置文件對些操作進行基于分支和路徑的精細控制。Gitolite採用的是SSH協議而且使用SSH公鑰認證。因此不管是管理員還是普通用戶。都須要對SSH有所了解。Gitolite的官網是:https://…

java任務分支和合并_合并/分支戰略

我會給出與Adarsh Shah相同的建議,因為在大多數情況下,2個分支(MAIN,RELEASE)就足夠了,并且使用feature branches用于你不想立即提交到MAIN的東西,因為它需要一段時間才能完全準備好測試 . 通過RELEASE,我指…

Spring安全:防止暴力攻擊

Spring Security可以為您做很多事情。 帳戶被封鎖,密碼鹽。 但是蠻力阻斷劑呢? 那是你必須自己做的。 幸運的是,Spring是一個非常靈活的框架,因此對其進行配置并不是什么大問題。 讓我向您展示一些如何針對Grails應用程序執行…

NopCommerce計劃任務

NopCommerce計劃任務轉載于:https://www.cnblogs.com/chenjz/p/6293210.html

簡單談談js中的MVC

MVC是什么? MVC是一種架構模式,它將應用抽象為3個部分:模型(數據)、視圖、控制器(分發器)。 本文將用一個經典的例子todoList來展開(代碼在最后)。 一個事件發生的過程&a…

BTrace:Java開發人員工具箱中的隱藏寶石

這篇文章是關于BTrace的 ,我正在考慮將其作為Java開發人員的隱藏寶藏。 BTrace是用于Java平臺的安全,動態跟蹤工具。 BTrace可用于動態跟蹤正在運行的Java程序(類似于DTrace,適用于OpenSolaris應用程序和OS)。 不久&am…

python 圖片轉視頻ffmpeg_python圖片轉視頻(opencv),ffmpeg壓縮視頻

要注意:1. 圖片傳視頻要自己設置幀率和分辨率2.讀取圖片后分辨率要resize為和視頻分辨率一樣才可以3.寫完.avi視頻后視頻比較大,用ffmpeg將avi視頻壓縮為mp4import cv2from cv2 import VideoWriter, VideoWriter_fourcc, imread, resizeimport osfrom su…

門面模式

門面模式的定義 門面模式(Facade Pattern)也叫做外觀模式,是一種比較常用的封裝模式,其定義如 下: Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface tha…

Mysql數據庫申請

前段時間大部門下新成立了一個推廣百度OCR、文字識別、圖像識別等科技能力在金融領域應用的子部門。因為部門剛成立,基礎設施和人力都是欠缺的。當時分到我們部門的任務是抽調一個人做新部門主站前端開發工作。本來說的是只負責頁面的開發工作。當我參加過需求品審會…

Spring–添加SpringMVC –第2部分

在上一部分中,我們為經理和員工實現了控制器。 既然我們知道了解決方法,我們將做很少(但僅做很少)更復雜的事情–任務和時間表的控制器。 因此,讓我們從org.timesheet.web開始。 TaskController 。 首先創建一個類&…