nosql的数据服务_使用NoSQL实现实体服务–第3部分:CouchDB

nosql的数据服务

在本系列的第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转换过程。

杰克逊是该项目的重要功能,因为我想实现从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”和“ Revision”字段重新映射到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

nosql的数据服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存穿透、缓存击穿与失效时的雪崩效应

问题,原理,解决方案转载于:https://www.cnblogs.com/tuhooo/p/8573614.html

android电视root权限获取,电视盒子/ 智能电视如何通过ADB获取ROOT权限?

如何通过adb获取root权限(安卓电视盒和智能电视通用)?Android 系统rom里面最主要的就3个文件:boot.img、system.img、userdata.img其中boot.img 存放着内核以及Android系统的配置信息,比如android系统各文件夹的读写权限,adb 的权限。所以如…

确定活动的热点垃圾收集器

StackOverflow问题查找正在运行哪种类型的垃圾收集 器,jvm的默认垃圾收集器 , 如何通过查看gc日志来查看正在运行的垃圾收集器? ,以及如何知道HotSpot jvm的当前GC策略? 和博客文章如何以编程方式获取GC信息表明了人们…

spring3: Aspectj后置返回通知

Aspectj后置返回通知 接口: package chapter1.server;public interface IHelloService2 {public int sayAfterReturning(String param); }接口实现 package chapter1.service.impl;import chapter1.server.IHelloService2;public class HelloService2 implements IH…

Android加密通信防抓包,[原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路)...

[旧帖][原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路)0.00元2014-5-12 22:071565[旧帖][原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路)0.00元2014-5-12 22:071565这篇文章我先在CS…

app store 关键词

如何选取关键字,让你的应用关键词越来越多? 很多朋友在做应用商店优化的时候,都会遇到一个让人很头疼的问题:如何选取关键词?关键词的质量直接关系到App的自然下载量,所以,我们应该用科学的办法…

android 调用微信语音识别,Android 仿微信语音识别

参考于:Android模仿微信语音聊天功能,这代码跑起来有问题,自己改动了一下,基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage com.nickming.view;…

android sendmessage和post的区别,handler中post和send方式区别

handler中post和send方式的区别1、从用法上send:发送的是Messagepost:发送的是Runnable对象具体用法,如下代码演示:MainActivity.javapublic class MainActivity extends AppCompatActivity {private TextView textView;private s…

耐心新来按部就班

当快速解决问题的思路行不通时,需要停下来,慢慢一步一步分析,找到问题根源,然后解决问题。转载于:https://www.cnblogs.com/Tpf386/p/8579365.html

Java:不朽的对象和对象复活

什么是对象复活? 当没有其他对象引用该对象时,该Java对象可以进行垃圾回收。 当JVM:s垃圾收集器最终将要删除未使用的对象时,将调用该对象的finalize()方法。 但是,如果我们再次使用对象自己的finalize()方法重新创建对…

老罗android oat,入门ART虚拟机(5)——OAT文件

Android安全交流群:478084054先贴老罗的一张图:再摘一段老罗的描述:“作为Android私有的一种ELF文件,OAT文件包含有两个特殊的段oatdata和oatexec,前者包含有用来生成本地机器指令的dex文件内容,后者包含生…

C#给字符串赋予字面值——字符串插入、转义序列的使用

1.占位符、字符串插入 给字符串赋予字面值时,经常遇见在字符串中包含变量的情况,用连接符进行拼接、转换的方式比较麻烦、还容易出错。C#提供了较为便捷的处理方式,即‘占位符’,以及C#6的新功能‘插入字符串’(没记错…

Dajngo-Xadmin 修改菜单摆放排序

问题: Xadmin 默认是读取了所有被注册到 xadmin 的模型生成对应的菜单!这个是没问题的 ,但是xadmin又对菜单做了 "通过菜单名称" 排序.英文状态下我们的排列至少是 a-z排列的,但是一到中文就乱了,完全不符合我们的要求. 解决办法: 要到达按照我们 在 django 的 setti…

华为鸿蒙2.0什么核心,鸿蒙系统2.0:安卓最核心部分基本已去除,将带来全新的体验...

早些时候,华为在东莞举办的华为2020华为开发者大会如期召开,在大会上华为正式发布了鸿蒙系统2.0,并称将于明年应用到智能手机上,其中升级了EMUI 11的用户可以优先获得体验鸿蒙系统2.0的资格,瞬间将会议推向高潮。值得一…

fork join框架使用_Java:使用Fork / Join框架的Mergesort

fork join框架使用此项的目的是显示一个Fork / Join RecursiveAction的简单示例,而不是过多地探讨合并排序的可能优化方法,或者比使用Exkutor / Join Pool优于现有的基于Java 6的现有实现(如ExecutorService)的相对优势。 以下是使…

Java最大公约数和最小公倍数的求法(辗转相除法)

这道题计算了三个数的最小公倍数 1 import java.util.Scanner;2 3 public class D {4 public static int gcd(int a,int b) {5 int max a>b?a:b;6 int min a<b?a:b;7 if(max%min ! 0) {8 return gcd(min,max%min);9 …

html隐藏块元素过度动画,CSS3实现DIV图层隐藏到显示的过渡效果

本文介绍CSS3实现DIV图层隐藏到显示的过渡效果&#xff0c;可用于产品列表的产品简介过渡显示与隐藏等&#xff0c;希望对你有所帮助。CSS3的transition过渡属性对于页面元素的显隐并没有提供过渡方法&#xff01;所以DIV图层从display&#xff1a;none到display&#xff1a;bl…

Java 8:在2分钟内将智能流与数据库一起使用

快速流媒体 当Java 8最终问世时&#xff0c;我和一些大学开始了一个开源项目&#xff0c;以利用Java 8的流库使整个Java / DB问题进一步向前发展&#xff0c;以便将数据库表视为纯Java 8流。 速度诞生了&#xff01; 哇&#xff0c;现在我们可以做类型安全的数据库应用程序了&a…

MapReduce 详解

MapReduce的整个运行分为两个阶段&#xff1a; Map和Reduce Map阶段由一定数量的Map Task组成 输入格式的数据格式化&#xff1a;InputFormat 数日数据的处理:Mapper 数据分组&#xff1a;Partitioner 下面流程图&#xff1a; 1. Map task 首先从HDFS上Read文件&#xff0c;通过…

16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二.doc...

16春季福师《计算机应用基础》在线作业二福师《计算机应用基础》在线作业二一、单选题(共 40 道试题&#xff0c;共 80 分。)1. ( )都是系统软件。. OS 和MIS. WPS和UNIX. UNIX和Wor. OS和UNIX正确答案&#xff1a;2. 在幻灯片浏览视图中&#xff0c;下列( )操作不能实现。. 复…