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

揭秘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云计算微博

千兆的带宽是不够的,最新研究将我们带入400G时代! 告诉你一个事实:移动互联网依然不大 一切才刚刚开始 戴尔的10亿美元云扩建计划到底是什么? iOS vs. Android,应用设计该如何对症下药? 扁平化设计五大原则 16种折磨开发者的方式 2013年度中国优秀开源项目征集活动正式启动 技术趋势:产品设计向“钱”看 服务器领域:旧时代已过 新时代正在降临 速度与金钱的碰撞:F1赛车将搭上大数据的东风 中国·北京第一届开源大会Hadoop专场侧记:Hadoop已经成为大数据分析平台的标配 Marissa Mayer为何带雅虎重回门户时代? 开发者最爱的三款开发工具 Facebook开源JavaScript库:React 硬件天堂深圳行:从Seeed Studio、Knewone到柴火创客空间 消费应用开发难赚钱?做个企业app store吧 开发开源软件的智慧:够简单,很好用 历届中国云计算大会PPT集萃(终章):架构到实践的全面解析 透过现象看本质:详谈数据可视化 专家观点:HTML5无法彻底抹杀Native应用 Google地图工程主管Raj Shah跳槽至微软在线服务部门 微软证实Windows 8.1引入类“开始”按钮 系统6月26日开放下载 PHP开发者意向调查:移动开发+云服务成为焦点 研发周报:16种折磨开发者的方式 移动周报:Jolla和Sailfish OS,那些你应该知道的事儿 优化技巧分享:把内存消耗降低至原来的1/20 85后程序员:独自一人,完成一个HTML5开源图形库 关于Waze的前世今生,你所不知道的事 代码审查——提高代码质量的终极武器 值得开发者关注的8个HTML5 API 最初设计方案大公开!LINE STAMP 贴图诞生记 DsgnIntf的问题 请问如何让自己的服务可以早点启动(普通服务,不是驱动服务)? 程序员的女人 请教一道网设的题目 请大家介绍几个热门的英文讨论的技术网站给我。 请教一个抽象类的问题 如何在dataset.tabel中将两个表能过双方的两个字段建议关系 高分求高手:jsp中如何获得服务器的网卡地址? 新手,请教C#入门 如何将列表框中所有的值都显示出来,不要有滚动条! 系统软件谁居第一 新人“ gxlxwp1982(我爱Delphi,就像老鼠爱大米)”来了,以后大家多帮忙!!!!1 使用Access数据库的SQL语句问题请教!!!! 谁有软件技术测试报告?给我一份参考一下啦~~~ : [求助]请各位帮帮忙呀! weblogic7.0的端口问题 如何在一个form中使用另一个form? win2kp 如何恢复丢失的桌面? 80年出生的都在干什么? SQL Server7.0升级到SQL Server2000 急需winsock2.h文件 delphi开发的程序在WIN2000,WINXP下运行正常,在WIN98却不行,是怎么回事? 如何在TOMCAT下重定向服务器不存在文件的错误页面 关于JFileChooser中的新建文件夹问题? 请问哪里有sun j2ee 服务器参考实现的源程序下载 今年一定考C++吗 考几道C语言的题目啊~~~~~~~~~~~~ VB调用COM接口,出现类型不匹配,如何解决? 关于拷贝构造函数,诡异。。。 如何使窗体永远在所有窗口的最前面! vsftpd 是配好了,但是登陆不上去 请问如何编程以其他用户的身份来运行一个程序? 我在同一ASMX文件中在某个WebMethod中调用其它的WebMethod出错,说不支持关键字“provider” 100分求进、销、存类程序源码 各位,请教一数据访问时间问题 七天七世纪 希望顶级高手能进来-->用streamReader的ReadLine读中文文件时出现乱码! 扩充话题 灌水乐园 与 程序人生 这两个版面在主题上有什么区别? 大家好阿,哪里有 WINDOWS XP操作系統下載,謝謝,最好不要激活, Webserver在引用时候怎样才能引用他的属性如: 来者有分,小问题 如何在自已的DNS服务器上解析两个不同的域名! 替换一个表中的数据的SQL怎么写 请问微星845GLM 如何实现usb启动 请问有人知道用其他程序把NOTES的工作台打开的方法吗??高分求解! 急!!计算机接通电源后什么反映也没有,硬盘不读,显示器不响应,主板不报警,我将显卡和内存反复插n遍以后,亮过一次,再加一根内存又 请问怎样设置文件的大小,才能大于4G. !!!!!!为什么我每次安装office2000到一半的时候,机器就重新启动了啊???????? 急!!计算机接通电源后什么反映也没有,硬盘不读,显示器不响应,主板不报警,我将显卡和内存反复插n遍以后,亮过一次,再加一根内存又 为什么正确的SQL语句运行会死掉??? 求助:求一在线时间统计程序 举一个缺乏主见的例子.一句话概括的那种, 至尊红颜 武则天去感业寺 是哪一集? 至尊红颜中武媚娘站在一片黄色的花中是哪一集 主见主见女孩问男孩有没有主见什么意思 做事没有主见,缺乏自信 ∠A=1/2∠B=1/3∠C是个什么角 若角A:角B:角C=1:2:3,则角A=()角B=()角C=() just open this page to 不知庐山真面目,只缘身在此山中这两句话的意思是什么 天空下吹拂着清凉的风 海水轻轻地摇 摇醒海鸥昨晚的梦 沙滩上没有了枪炮的声音 美丽的贝壳带来龙宫的祝语模仿上面的这节诗 写一段啊 至尊红颜武媚娘身体里面有龙跑出来的是哪一集? 欧盟成立20周年一体化频遭挑战 经济中国珠算进入2013年联合国人类非物日本最新型潜艇“黑龙”举行下水仪式俄八旬老汉野外斗熊 被摔下悬崖后逃出索契冬奥会火炬将由14架直升机护送入加拿大首设“比特币”ATM机 被批缺偷渡惨案再现撒哈拉沙漠 尼日尔发现8“监听门”持续发酵,美国扮演“地球网Google建造数艘集装箱货船引发猜荷兰边城见证《马约》风雨20年美国全球监听引发网络空间深刻变化当股价下跌时,阿里、聚美、途牛、土豆A股暴跌 向市场认错就是值得肯定第四届亚太商业地产建筑设计效能高峰论|单品|别告诉我你竟然没有一条好穿的投资者持币观望,车贷人气回落 -车[不朽]远征军老人泪眼回忆:自取腿上中元节祭祀“火力全开” 我们该如何是[母藏儿尸]住户半夜被臭醒 楼下竟然[胆子大!]六旬男子竟然行窃功德箱[反思]巴中清江发杀狗令 有人支持 [今晚去哪儿吃]开学季将至 校园美食东方地狱火重生之官道校园至尊王重生之被动技能大唐万户侯鬼打墙武当祖师张三丰闪电召唤者都市之疯狂异能者炼体王帝国狂澜爱与希望之宫旅游鸠兹旅游陆和村茶艺博物馆旅游天宫院旅游唐布拉风景区旅游石门坊旅游秀峰旅游西中岛旅游香港浸会大学旅游红磡码头旅游车溪旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘