使用NoSQL实现实体服务–第3部分:CouchDB
正如我在第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进行...
- 创建一个新的JaxB产品对象并为其分配一个ID
- 将其保存到我的CouchDB“产品”数据库中
- 使用ID从“产品”数据库中读取产品对象
- 修改并更新产品对象
- 再次检索它,检查版本是否增加
- 最后, 删除产品对象并检查现在尝试读取它的操作是否失败
如果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实现实体服务–第3部分:CouchDB相关推荐
- nosql怎么使用_使用NoSQL实施实体服务–第5部分:使用云提高自治性
nosql怎么使用 在之前的文章中,我讨论了如何通过结合使用Java Web Services , Java EE和CouchDB NoSQL数据库为产品构建SOA"实体"服务. ...
- nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述
nosql的数据服务 在过去的几周中,我一直在进行一些研发工作,以了解使用NoSQL数据库实现实体服务 (也称为数据服务)的优势. 实体服务是Thomas Erl的<服务技术>丛书中提出的 ...
- java nosql_使用NoSQL实现实体服务–第4部分:Java EE
java nosql 现在,我已经准备好了一个框架式的合同优先型Web服务,并使用Ektorp和CouchDB创建了一个数据访问层 ,是时候将它们连接到一个可以正常工作的实体服务中了 . 为此,我将使 ...
- nosql的数据服务_使用NoSQL实现实体服务–第3部分:CouchDB
nosql的数据服务 在本系列的第2部分中 ,我使用SOA的"合同优先"技术创建和部署了产品实体服务,现在,我将致力于服务实现的NoSQL数据库方面. 正如我在第1部分中已经提到的 ...
- nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
nosql的数据服务 现在该开始使用NoSQL项目对SOA实体服务进行编码了,并且正如我所承诺的,我将从Web服务的合同开始. 看一下本系列的第1部分 . 这种从Web服务合同定义开始的技术是面向服务 ...
- 使用NoSQL实施实体服务–第5部分:使用云提高自治性
在先前的文章中,我讨论了如何通过结合使用Java Web Services , Java EE和CouchDB NoSQL数据库为产品构建SOA"实体"服务. 在本系列的最后一篇文 ...
- 使用NoSQL实现实体服务–第1部分:概述
在过去的几周中,我一直在进行一些研发工作,以了解使用NoSQL数据库实现实体服务 (也称为数据服务)的优势. 实体服务是托马斯·埃尔(Thomas Erl)的<服务技术>丛书中提出的服务分 ...
- 使用NoSQL实现实体服务–第4部分:Java EE
现在,我已经准备好了框架式的合同优先型Web服务,并使用Ektorp和CouchDB创建了数据访问层 ,是时候将它们连接到一个可以正常工作的实体服务中了 . 为此,我将使用Java EE和Glassf ...
- 使用NoSQL实现实体服务–第2部分:合同优先
现在该开始使用NoSQL项目对SOA实体服务进行编码了,并且正如我所承诺的,我将从Web服务的合同开始. 看一下本系列的第1部分 . 这种从Web服务合同定义开始的技术是面向服务的体系结构实现的&qu ...
最新文章
- 邮件数据恢复解决方法
- java web 来源页_JavaWeb 分页实现
- 汇编语言--标志寄存器
- Java10来了,来看看它一同发布的全新JIT编译器
- 一位被信息时代遗忘的隐秘天才,一个为人类而战的传奇故事
- 涨姿势,一个通信项目从开始到结束,原来还包括这些工作
- 数据结构系统学习(1)数据类型和数据结构的概念
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- 速成pytorch学习——6天Dataset和DataLoader
- css在线代码生成工具汇总
- java-assured_rest-assured之获取响应数据(Getting Response Data)
- 图像处理在医学方面的应用
- Docker-docker-compose学习笔记(yaml,实战)
- VC 蓝牙设备 编程
- 苹果系统 python闪退怎么解决_MacOS pyinstaller 打包python应用闪退问题解决
- MOOS-ivp 实验一 MOOS软件的安装与执行
- Codeforces Round #657 (Div. 2) B. Dubious Cyrpto(思维,数学)
- 武侠小说大全隐私政策
- postcss-pxtorem使用方式
- mysql最快导表,IIS通过ISAPI_Rewrite完美实现Wordpress伪静态 | 沉默过客
热门文章
- java集合——队列和双端队列+优先级队列
- mybatis多表新增如何获取主键ID
- 怎么清理句柄_JAR文件句柄:混乱后清理!
- orm提取指定列_使用ORM提取数据很容易! 是吗?
- kafka数据到flume_大数据摄取:Flume,Kafka和NiFi
- 将经过身份验证的用户注入Spring MVC @Controllers
- es 调整gc_实际中进行GC调整
- java 排序性能_Java8排序–性能陷阱
- java 泛型示例_使用Java泛型的模板方法模式示例
- activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分