说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

揭秘MongoDB最新Java驱动:更好的JVM支持,指日可期的异步

HTML文档下载 WORD文档下载 PDF文档下载
Java无疑是最受欢迎的编程语言之一,然而传了已久的MongoDB Java Driver 3.0却迟迟不肯面世。近日MongoDB Java工程师及布道者Trisha Gee解释了这一原因,并揭露了新版本驱动设计的6个目标。

或许你已经从种种渠道得知10gen JVM小组正在致力于3.0版本的Java驱动开发,然而如果你了解这项起于2012年底的项目至今却尚未完成,肯定会感叹一句“10gen的哥们,又打酱油了吧”。近日MongoDB Java工程师及布道者Trisha Gee在公司博客中撰文解释了这个原因,并为我们揭开了新版本驱动的面纱,以下为译文:

那么为什么要废如此功夫去更新驱动,我们又想达到什么目的?OK,下面看一下需求:

  • 更容易维护
  • 更容易扩展
  • 更好的支持ODM、第三方库以及其它的JVM语言
  • 给Java开发者更好的体验

不错,非常概括,基本上可以理解为驱动的全面提升,所以我们需要更切实的目标:

  • 一致性
  • 更清晰的设计
  • 直观的API
  • 容易理解的异常
  • 友好的测试
  • 向后兼容

一致性

Java开发者在使用驱动时发现了许多不一致的地方:Java驱动中的用法会不同于shell或者是其它驱动;甚至使用Java驱动时,方法命名的方式同样让人困惑(CreateIndex与ensureIndex);参数的顺序也经常不同;有时候方法被重载多次,你还是会使用method chain。虽然存在QueryBuilder,但是有许多场景下你还是需要手动的构造一个DBObject,等等。

如果你在使用这个驱动,即使你有轻微的强迫症,代码的一致性也可能让你发疯:空格的用法、花括号的位置、字段的位置、混淆的字段名称等等。有些人可能会对此不屑一顾,但是对于驱动初学者来说确实造成了不必要的困扰,同样这也意味着增加特性或者是修复bug将花费更长的时间。

更清晰的设计

其实驱动的义务非常的简单及单一,即负责Java和BSON的转换。毕竟,其根本责任就是扮演应用程序和MongoDB之间的桥梁,而做的也是将方法调用和Java对象转换成wire-protocol消息,反之亦然。不错,这是驱动本分,但绝对不是唯一。MongoDB支持横向扩展,这就意味着应用程序可能会运行在多台主机之上——可能在从节点中的一个读取数据,也可能在分片的环境中进行读取,当然也可以只有一台服务器。而驱动的目的就是让这一切对应用透明,所以它就像是在做server discovery,选择合适的服务器,并在适当的地方尝试重用连接。连接池的管理同样由其完成,还有序列化和反序列化,这里存在一个完整的连接管理模块。

驱动的作用还包括在协议和应用之间提供一个恰当的抽象级:驱动有着自己的域,而这个域需要以相同的表现形式设计——与Document、Collection、Database相同,让用户可以更加直观的使用。

显然驱动的设计目标不仅仅是为应用开发者使用。通过合适的设计,我们可以让其它的库及驱动更容易重用一些low-level代码(比如BSON协议、连接管理等),而上方使用的是自己的API——比如Spring Data、Morphia以及其它JVM语言(比如Scala)。取代将驱动作为Java开发者连接MongoDB的默认方式,我们更愿意将它设计成JVM驱动,让你可以在上面建立正确的抽象等级,因此内部构件可以更容易的为其它库重用。

为了实现这些,我们必须重新设计驱动,而核心就是围绕用户API的封装——就我们而言,我们需要提供一个非常类似旧版本的逆向兼容API。核心就是ODM和其它驱动在提供自己API的同时可以重用一些通用功能。这样就保证了横跨多个JVM驱动与库在和数据库通信时的一致性,同样允许应用开发者通过最直观的API去使用这个库来满足需求。

直观的API

我们想建立一个这样的API:

  • 让Java开发者感觉非常熟悉
  • 通过shell与MongoDB通信的逻辑是否符合你知道的(鉴于大多数我们的帮助文档都引用了shell)
  • 是否与其它语言驱动一致

基于这些需求,新版驱动的耗时就完全符合逻辑了。至今这些需求仍然在努力当中,从Java的角度上讲,我们需要完成以下几个点:

  1. 静态类型是Java的一个优势,所以我们也不能失去它。我们渴望IDE来帮助你,当你在尝试决定使用哪个方法及他们的参数时,我们期望Cmd+space就可以给出正确答案。
  2. 泛型。已经被使用近10年,我们希望在驱动中也可以存在。
  3. 我们期望MongoDB中名称和协议的使用会有一个非常好的体验,所以不会再有DBObject,请期待Document吧。
  4. 在建立查询和对象时有更多的帮助,更加容易理解并且拥有自描述。

可以理解的异常

当你为别人排错时,许多驱动抛出的异常显得毫无用处。甚至用户都无法确定这个异常的抛出者(服务器还是驱动),所以我们引入了客户端和服务器的异常概念。我们还引入了一些其它异常,所以取代得到一个MongoException和一些需要许多工作才可以理解的异常,我们为各种不同场景设计指定的异常(比如,MongoInvalidDocumentException)。

友好的测试

我在写第一个MongoDB与Java应用程序时做的第一件事就是mock驱动——如果你想做一些综合测试,你可能同样会mock或者stub驱动,这样你就可以分离MongoDB对程序进行测试。但是这里完全不行,所有类都被定义为final,并且这里不存在任何接口。即使在数据库上可以执行系统、整合、功能测试,同样存在区域隔离测试的需求,我们需要一种简单、快速的测试,可以检查工作是否如预期的执行。

新的驱动使用了API级别接口,这样就可以mock驱动来测试应用程序,清晰和解耦的设计让其可以更容易的进行驱动内部构件测试。当下我们已经在功能和单元上同时实施Spock测试,用以提升内部驱动测试的范围和可读性。

此外,我们还在acceptance测试(Java中,而不是Groovy或Spock)上做了努力。这里的目标就是为驱动建立一个动态的文档——不仅是如何去操作,同样包括了很多计划外发生事情的记录。同样许多工作尚未完成,我们期望随着时间的增长,这些问题都会被改善及解决。

向后兼容

同样重要的是,所有这些大型重设计、架构以及API都必须是向后兼容的。我们致力于现有客户,当然不希望他们在接受新驱动时要做太多操作上的改变。我们期望升级可以温和的进行,即使这样会给驱动的开发带来很多困难,但是我们认为可以更好的对新驱动进行验证——取代摒弃现有功能,我们可以在新驱动下兼容的运行当下测试套件,从而来验证结果是否相同。

总结

从MongoDB的官方博客中,我们不难发现新的驱动对Java开发者更加友好,然而用户最关心的异步支持并未出现在任务列表中。但值得庆幸的是,而文章后的用户提问中,Trisha Gee指出新驱动的设计已经考虑异步支持。虽然不能保证在3.0版本中得以释放,但是在下一个版本肯定会得以实现。

原文链接: The MongoDB Java Driver 3.0 (编译/仲浩 审校/周小璐)

更多内容请关注CSDN云计算频道 及@CSDN云计算微博

Delphi中控件深度投影及阴影效果的实现 DELPHI中利用对象的常用属性制作动画 Form生成时的事件次序-Delphi资料 LED数码管仿真显示程序-Delphi资料 TPaintBox与TImage的比较-Delphi资料 WINDOWS基于调色板的图像消隐-Delphi资料 改变图片效果-Delphi资料 改造HINT的输出方式-Delphi资料 基于Delphi的图像漫游 将BMP放入Paradox的BLOB的字段中-Delphi资料 界面色彩渐变效果的实现-Delphi资料 如何查阅可视窗口标题-Delphi资料 如何得到Timage控件的DC-Delphi资料 如何关闭一个MDI子窗口-Delphi资料 如何检测鼠标击了哪一个对象-Delphi资料 如何将鼠标锁定在固定范围内-Delphi资料 如何使你的窗口Stay on Top-Delphi资料 如何在ListView控件中绘底图-Delphi资料 如何在屏幕上移动Image图象-Delphi资料 软件中复活节彩蛋的实现-Delphi资料 实现图象局部放大的原理和方法-Delphi资料 使用Delphi实现滚动式面板窗口 通用的MsgBox-Delphi资料 图象放大镜——实现图象局部放大的原理和方法-Delphi资料 图形的特殊显示效果-Delphi资料 图形整体拉出效果-Delphi资料 一个实用的Delphi屏幕拷贝程序的设计 用Delphi 显示122种图形特效 用Delphi编写DLL实现动态改变分辨率 用Delphi进行OpenGL编程学习心得 用Delphi开发windows95屏幕保护预览程序 ASP(javascript)自动回复问题?? ★★母亲的生日★★ 哪位有没有用spcomm控件进行串口通讯的例子? 大家帮我看看这是用哪个做的? 关于打印... 两路由器的使用方法比较,哪个好些? 在线求助:有没有改变电脑所连的打印机打印属性方向的API函数?多谢 我要送分 设置ejb的几个接口时,我有点弄不明白 有没有什么办法把ACCESS的表打印出来?格式改变一下? 烦啊~~~~ 谢谢!如何让对话框的大小不受屏幕分辩率的影响??? 请问怎样避免多用户同时访问数据库中的表? 简单问题:怎样用url打开一个文档?多谢 怎么控制小数的位数? 这个QQ炸弹好厉害,是什么原理呢? 我的问题怎么老是出现在这个地方。。。。 一个对话框程序调用dll中函数的问题! 请教有关类的扩展 请问WIN2000专业版IIS为什么连接限制是10 急,为什么我的数据库会出现这样的错误? 寻求一个好的全屏翻译软件(在线等候,在线给分) 寻找《编译原理与时间》电子文档下载url 升级了,散分小庆.认识的朋友进来捧个场,不认识的也进来热闹热闹!忠心感谢:-) 奇怪的问题 如何解决在一个表单中多个提交按钮的问题? 请问怎样关闭135端口 Photoshop7.0的一个简单问题,大师们帮帮忙! 关于动态查询的问题? 请问如何验证代理服务器? 超过半个小时不作任何操作就把这个连接KILL掉,改如何做呢? 如何才能做出只存在于托盘栏的程序! 搜集VB绘图源代码,多多益善 北京市里有没有支持asp.net的服务器空间提供吗? GGJJDDMM 帮帮我啊~~~~ 新手的问题--如何作到点击页面中的提交按钮,只刷该页面的DataGrid部分,而其它部分控件值不变?(在线给分) 大家帮忙,要取得客户端的信任,用服务器控件对客户端进行读写文件的资料? 谁说我们要和兄弟会和解了? 一直都是你们在攻击我们,靠还和解?道歉差不多。 版本的差异造成的问题,ADO连接SQL Server。求教!!! 海宜派(NSU Pie) 为什么insert into语句不能完成添加? 在线等一个简单的问题! 能用DOS盘启动然后用GHOST 备分LINUX分区吗?我想备份我的LINUX系统。 SQL中能否用CopyMemory这样的函数??? 我的猫竟拨不上号 一个菜问题 type和typedef有什么区别? 100分问题,在线等,本地XSL,XML,使用VB脚本,使用MSChart生成图形,刷新几次后IE崩溃,高分求解 socket.setSoTimeout() BCB使用ClientDataSet调用Sybase存储过程的问题 趟过“地雷阵”的铁面总理 (转载) 为什么恒星都是轻元素组成为什么太阳上的主要元素是大约70%的氢元素和20%的氦元素? 银河是有多少颗恒星组成?我以为百度知道是万能的,没想到,你们竟然也不知道.... 为什么动物的耳朵长在头上,而人的耳朵长在头的两边上?这是我五岁儿子问的问题,把我难住了, 朋友在遇到困难的时候我该怎么样安慰他? 求大神帮我做一个弹弓架CAD图纸 只要上面的这个支架,但是不用像这个打眼这么麻烦,简单的能穿皮筋的孔就可以,要能打3到4个孔.弓门宽度和普通的弹弓差不多久可以,大概内侧6CM,外侧8.5CM,高 是不是反应物中有固体反应产物中就不用写沉淀符号?氢氧化亚铁在空气中生成氢氧化铁为什么不用沉淀符号? 用似乎造句,不是比喻句 弹弓图纸长度单位是什么只标了数字,单位没有 书本上产生的氢氧化铁为什么不用打沉淀符号? 造句:新鲜①没有变质:②清新的:③少有的,不多见: 在封建社会中,影响中国小农经济稳定发展的因素有哪些 营养素参考值为什么经常看到有超过100%的?如题,这个现象经常在食品包装上看到,这是为什么呢? 造句(比较特殊)人类也许(应该从旅鼠身上学到点什么)例如,如果人类(也毫无节制地繁衍下去),也许(有一天不得不走旅鼠的道路).用括号外面的词造句,括号里面的是要补充的部分急 用奇特造句(写出奇特在哪里) 火炕烧柴火好烧 烧煤就不爱着是怎么回事?和炉必子低有关系吗、. 星云不是由气体和尘埃组成的吗?.那为什么会燃烧呢?如果它没有燃烧,那为什么能发光呢? 历史上亚洲的许多国家都是小农经济,为什么唯独中国的封建社会持续的这么长? 煤可以制造成( )、( )、( )、(煤可以制造成( )、( )、( )、( ) 关于你的朋友在英语上遇到困难想放弃的一篇劝说信 “你认为小农经济为何在封建社会末期会阻碍资本主义生产关系的发展”还有小农经济的特点 蛋白质灼烧会产生什么现象 灼烧不能区别丝和羊毛?郁闷,C.压缩天然气和液化石油气是两类常见的清洁燃料,都属于碳氢化合物 D.用灼烧的方法可以区别丝和羊毛 哪个对?理由,我纠结丝的本质. 葡萄糖经过肾小球时,是一部分被过滤还是所有被过滤? 酒精喷灯长时间灼烧可以使玻璃软化到什么程度? 七大洲的英文单词怎么说啊 还有它们的读音? 羊毛和纯棉可以用灼烧的方法鉴别吗? 肾小球的滤过作用会拦截住大分子葡萄糖么?RT 肾小球的滤过作用会拦截住大分子葡萄糖么? 下列关于恒星叙述正确的一项是?A恒星都是由炽热的气体组成的能自己发光发热的天体B恒星的质量体积比地球小 C恒星在星空中的位置是固定不变的 特殊造句 做建筑玻璃贴膜前景如何?小弟关注玻璃贴膜很久了,一直想去从事,不知前景如何,请各位前辈赐教! 蝙蝠是如何看见东西 特殊怎么造句 森林里开动物大会,哪一只动物没有来? 蝙蝠如何看见东西 用特殊造句 为什么动物会有尾巴 我家养了两只蝙蝠、它们吃什么的? 在要开森林大会 斑马生病了 请问还有什么动物没来? 某用电器功率过大导致断电是否会损害其他连接在相同插线板上的用电器?今天我把一个功率很大的烧水锅插在了插销板上,结果因为功率过大导致断电.事后突然想到那个插线板上还连着许多 电厂CFB锅炉 煤仓堵煤问题怎样解决注意 震打装置没用 液压疏通没用 空气疏通没用 煤仓内壁加高分子板才没用 希望给点改造建议 男人什么环境下肾上腺素会升高 连接在插线板上用电器总功率不能超过插线板最大负荷对么? 关于2012年世界末日的说法 怎么会肾上腺素飙升 在多个插线板顺线后导致用电器不能稳定工作 事关生命...内详本人住校学生 人在湖南 养了两只乌龟 因宿舍晚上熄灯 为了保证小幼龟正常过冬 便私自将走廊上夜晚长明灯的电 接到了宿舍里 做平抛运动的物体是处于超重状态还是处于失重状态?还是都不属于? 肾上腺素过多会产生什么现象? 因为人死了而写的悲伤句子 请问.说是2012.世界末日这种说法是真的吗 用非常造句 对死的看法和悲伤原因的诗句我有急用 2000年时也曾有传过世界末日的说法吗?为什么听到别人说曾在2000年时也曾传过有世界末日的说法?我都没听说过呢.可能是当时我太小了,那现在的2012世界末日也只是一种谣言吗?会不会真的是 谁知道恒星的构造和位置? 生物习题. 下蹲过程中,人是处于失重状态还是超重状态? 恒星结构是怎样的啊? 每日一题(495):血液透析用水与饮用水有什么区别? 做如下运动的物体,处于失重状态的是(1)加速上升(2)加速下降(3)减速上升(4)减速下降可多选 有关天文恒星组成结构我最近看了星际传奇,对电影里的三个太阳组成的结构很好奇,可是不知道它是怎么构成的,还能日食,我想了很久都想不出个所以然,求大家帮我分析分析, 什么动物耳朵长在脑背后 九省区市可网查个人信用 注册到看结果“灰代办”黑色交易揭秘:北京买套房省央行个人征信平台体验:网查信用记录要1477吨进口菜油掺入国储库 中储粮评论称转基因食品屡屡混入国储库跟管理英国“小报女王”将接受刑事审判 令世美国多名政客支持监听 吁欧洲提高自身美国多名政客支持监听 吁欧洲提高自身人民日报谈教育实践活动:有些干部只说温岭数百医护人员抗议医疗暴力 呼吁严德媒:窃听丑闻得教训 要像中俄一样变德国社民党称需要成立调查委员会 斯诺英国发生强烈暴风雨天气已致4死 逾6遵义市委书记廖少华被调查 曾多次强调英国发生强烈暴风雨天气已致4死 逾6德国社民党称需要成立调查委员会 斯诺安倍突访土耳其 传为劝阻土放弃购中国媒体称废品价格10年不涨 收一车东西江苏沛县办公楼豪华超标 称四套班子领坦桑尼亚军方证实一名坦维和军人在刚果温岭数百医护人员哀悼遇害医生 上百医查处买官卖官就该一个都不放过中国女排惜败塞尔维亚游泳轶事医院外科勾结采购吃药品回扣疏导商贩无烟经营女子实名举报副局长强奸保级大战毅腾输申鑫连偷一小区 5次窃8电缆世界卫生组织:埃博拉疫苗2015年前金星木星将上演“星星相吸”辛辛那提赛小威鏖战逆转 五连胜沃兹晋中国女排晋级大奖赛总决赛中国第24批援助几内亚医疗队和第二批长沙去南昌坐高铁一个半小时广东省纪委书记告诫干部使用了哪个网络茂名卖官案起底 242名县处以上干部苏州一女婴家中熟睡时被偷市民来电欲捐助10岁女孩思思中国女排晋级大奖赛总决赛乐高积木“建长沙”,快来长啦网报名出走半个月,妈妈你在哪里
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘