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

揭秘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资料 子目录级的文件查询的实现-Delphi资料 Delphi中ChartFX构件使用详解 Delphi中动画设计 Delphi中对Jpeg格式文件的处理... Delphi中多媒体组件使用解析 Direct3D起步:教程以及资源指南-Delphi资料 播放背景音乐-Delphi资料 弹出、关闭CD-ROM驱动器-Delphi资料 检测声卡存在-Delphi资料 控制声音音量-Delphi资料 让pc speaker美妙动听-Delphi资料 闪动标题栏-Delphi资料 使用 DirectX 优化声音特性-Delphi资料 修改Delphi 3图形处理中的错误 用Delphi 3.0编制MP3音乐点歌台 用Delphi编制MP3音乐点歌台 用Delphi编制趣味动画鼠标 用Delphi开发屏幕保护预览程序 用DEPHI3.0实现动画ABOUT窗口-Delphi资料 在Delphi下用Direct Sound 实现混音器组件 在Delphi中使用DirectX BDE的替代品大全(按数据库类型分)-Delphi资料 BDE的替代品大全(按应用类型分)-Delphi资料 bde的组态文件-Delphi资料 DBGrid中的下拉列表和查找字段编程方法-Delphi资料 Delphi 3.0 中 连 接 数 据 库 的 三 种 方 式 Delphi 3.0中连接数据库的三种方式 Delphi 4中开发数据库控件的方法 Delphi:MIDAS中动态强制约束编程 Delphi 5下要做一个多 Y 轴的曲线图形,如何实现? 哪有xteamlindows下载?? 万分感谢!!!!! borland 会不会出一个 C# Builder? 乱码,头大了,不知道为什么pb导入excel怎么办 数据统计问题,请大侠门帮忙!急急急!!! 求解ZModem通讯协议源程序----有谁用过CZModemCore 我也不知道对不对! 最高级的问题?搞一个专业的VC程序员基地~~~~~~ 在研究directshow filter的push模式的兄弟请进 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了 有两个问题,每题40分,马上给分!!!! 如何使用打印机? 在爱情方面谁能做到这一点? 谁有 file cutter v1.4的注册码? 有急用! 搞一个专业的VC程序员基地~~~~~~谁愿意加入????? 最新发现:原来C++Bilder的项目文件(.bpr)是XML格式的! 关于FAT32和NTSF的问题 如何用VC实现Email的发送? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了! 搞一个专业的VC程序员基地~~~~~~需要网页制作高手!! ADO 的用法 m_pRecordset->Fields->GetItem(index)->GetName() 关于CRichEditCtrl的问题之二,取的当前可见行数? 请问在哪里下载IMAIL SERVER???各位帮帮忙!!! 高手请回答,ADO和BDE到底有什么区别,你选择谁?为什么? 高分求教!!!!!!!!!!!!!!!!怎样得到局域网上所有的机器名?(普通WINDOWS网络,用VB?,好象用WNET API可以的) 如何安装com.ibm.bridge2java.*这个包阿? 有人吗???求救! 你也许也会遇到这样的问题? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!!! 大虾看过来. 一个access表一万条记录,想转到Mysql下(Mysql在Linux下)用什么方法和什么语言来做好? rs.CursorLocation=aduseclient是什么东西? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题! 简单SQL,免费送分! 用ASP如何上传文件,可以用组件。 谁知道怎么改运行中的程序的托盘图标???我用SysTray.ocx不能改? 新手提问,简单题目,大量给分~~~~~~~~~~ 如何使用getdispatch(), 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!! 关于在一个窗口中的多个数据窗口的问题 扔块砖头, 开个场子 。 ( yeti_lee ) 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了? To: baicolt(五岁的小新是我师傅) 有没有人用过Jcreator 如何在sql server 的查询分析器中用sql语句转到另一台机器上的数据库,同样了sql server的 是不是MSHFlexGrid的bug? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了?? 这个错误类型是什么意思? 如何能够简单的得到昨天的日期? NetBios-SSN是什么? 6吨等于多少克 在比例尺是1:5000000的地图,上量的甲、乙两地的图上距离是6厘米,把它画在比例尺是1:3000000的地图上,应画多少厘米 1kg棉花和1kg铁块相比谁的密度大?杀人砂仁提问 一根绳子第一次用了全长的1/4,又用了5/2米,这时已用的/剩下的=2/3,绳子长多少米 1根绳子,用去5米后,剩下的长度是用去的百分之八10,这根绳子原长多少米? 1T棉花和1T铁块比较,以下说法正确的是A.棉花体积较大,所含物质较多 B.铁块掂着较重,所含物质较多 C.棉花和铁块质量相等,所含物质一样多 一根绳子第一次用去全长的1/5,第2次用去3/5米,两次共用去这根绳子的1/2.这根绳子长多少米? 在1:5000000的地图上,量得甲,乙两地的图上距离是6厘米,把它画在比例尺是1:3000000的地图上 应画多少 1kg的棉花和1kg的铁块相比,下列说法正确的是A.棉花所含物质较多 B.棉花和铁块所含物质一样多C.铁块所含物质较多 D.不是同一种物质,无法比较 上海到杭州的实际距离大约是150千米,在一副比例尺是1:3000000的地图上,两地之间的距离是多少厘米?随便帮我把答案算出 在1:5000000的地图上,量得甲、乙两地的图上距离是6cm,把它画在比例尺是1:3000000的地图上,应画多少厘米? 数学二进制、八进制、十进制、十六进制之间如何转换?这几种数值之是转换是以什么为依据的?怎样转换更方便、简单、快捷?转换关系是什么?(本人急用,请走过、路过的朋友帮帮忙忙吧.本 在一幅比例尺为1:3000000的地图上量得上海到杭州的距离为5cm,把它改画在比例尺为1:5000000的地图上,上海到杭州的图上距离是多少厘米?(如果不会,不妨用方程试试!) 小学换算公式0.4千米=( )米1200米=( )千米284克=( )千克532厘米=( )米1480米=( )千米1.5千米=( )米1670米=( )分米1.48千米=( )米 谁能帮我讲解一下数学里的十进制,二进制?我学计算机的,因为要涉及到这方面的问题,我不懂,所以请谁帮我讲解一下,谢``` 你知道华北平原的人们种植的主要农作物有哪些?你的判断依据是什么? 在一幅比例尺是1比5000000的地图上,量的上海到杭州的距离是3.4厘米.上海到杭州的实际距离是多少? 一根绳子长8/7米,截5次后,剩1/8米,平均每次截几米. 4*7等于多少? 在一幅比例尺是1:5000000的地图上,量得上海到杭州的距离是3.4cm.上海到杭州的实际距离是多少 60秒等于多少小时? 请问1mbar等于多少kpa 在一幅比例尺为1:3000000的地图上量得上海到杭州的距离为5cm,把它改画在比例尺为1:500000的地图上 60小时等于多少秒. 200磅等于多少KPA 700米 800米等于多少吨? 12亿秒等于多少小时?或等于多少天? 100升等于几千克 15米长的绳子,用去五分之二,还剩()米?一根绳子,用去五分之三米,还剩12米,这个绳子()米?一根绳子,用去四分之三,正好用去15米,还剩()米? 35亿秒等于多少小时 要说清楚 我除了也是97。但是这么多个小时 郁闷 要玩到什么时候 郁闷 那又是多少天呀 5060克等于几千克几克 在一幅比例尺是1:8000000的地图上.量得A、B两地之间的距离是3厘米.A、B两地间的实际距离是().A.80千米 B.2400千米 C.240千米 一根绳子的长度等于它本身长度的四分之三加上四分之一.这根绳子长多少? 压强1Pa等于多少克的压力 一幅地图上的比例尺是1:2000000,把它改写成线段比例尺是( ),在这幅地图上量得A、B两地的距离是15厘米一幅地图上的比例尺是1:2000000,把它改写成线段比例尺是( ),在这幅地图 一根绳子的长度等于它的本身的四分之三加上四分之三米.这根绳子长多少米? 1200克等于几千克几克 一根绳子,先用去40米,有用去余下长度的五分之二,这时余下的绳子正好是原来总长度的三分之一.这根绳子原来长多少米?(不要用两边都有X的方程) 有一堆沙子,第一次运走五分之一,第二次运走剩下的五分之二,问那一次运走的多,为什么?(列算式) 在一幅比例尺是1:200000的地图上,量得甲、乙两地距离20厘米.如果在另一幅地图上,甲、乙两地距离8厘米.另一幅地图的比例尺是多少 在比例尺是1:3000000的地图上,量得两地的距离是6cm.甲、两辆汽车同时相向开出,4小时后相遇.已知甲、乙两车的速度比为4:5,求甲、乙两车每小时各行多少千米? 一堆沙第一次运走了四分之一,第二次运走了五分之二,还剩下14吨,这顿沙原来有多 许伯伯承包了2公顷土地,他把其中一半用来种植棉花,棉花的种植面积是多少平方米?还有一道:一个储水器中装有2m³纯净水,如果把这些水分撞到容积为10升的水桶中,可以装多少桶? 在一幅地图上,比例尺为1:300000,量得A、B两地的距离为18厘米,则A、B两地的实际距离()千米 数学换成乘积的形式谢谢(4) 许伯伯承包2公顷土地,他把其中一半用来种棉花,棉花的种植面积是多少平方米? 1十1等于多少 数学换成乘积的形式谢谢(2) 一根绳子长60米,第一次用去1/3,第二次用去1/4米,还剩()米 要过程 请问:工作压力:10Kg/cm2 (十千克每平方厘米)等于多少KPa怎么换算的 求超大数字乘积 表达式意义2017612633061982200*18446744073709552000=?上面数字乘积等于多少,3.7218383881977644e+37;这个数字表示什么意思 我要求的数字是10的2017612633061982200*18446744073709552000 次方也就是1 一根绳子长100分米第一次用去3分米;第二次用去40分米;还剩多少米 0.02kg/cm2等于多少kpa?最好说明详细计算方法, 1亿除以60等于多少?拜托 一条绳子长15分米,第一次减去他的1/3,第二次减去它的1/2,还剩多少米 1kg/cm2等于多少kpa/0.01mm 在一副比例尺为1:3000000的地图上,量得A、B两地之间的距离是4.5厘米.再另一副比例尺为1/5000000的地图上,A、B两地的图上距离是多少? 7磅 多少克 压力单位50psi等于多少kg/cm2 还等于多少kpa 在比例尺为1:3000000的地图上,图上1厘米表示实际距离多少千米?在1:3000000这个比例尺中所表示的实际距离是图上距离的多少倍?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn