java连接mongodb源码解读

  

,,,,用mongdb也大半年了,一直是业务上的逻辑实现了就好,然而这样并不能进步……因此今天查了查java连接mongodb驱动的源码,搜到的各种信息整合一下,方便以后深入的使用。

,,,,先贴连接数据库代码

,List replicaSet =,新的   ,,,,,,,,ArrayList ();   ,,,,,,,,replicaSet.add (new  ServerAddress (127.0.0.1,, 27017));   ,,,,,,,MongoClientOptions  option =,,,,,,,,MongoClientOptions.builder () .autoConnectRetry(真正的).connectionsPerHost (300) .maxWaitTime (30000) .build ();   ,,,,,,,,MongoConnection.init (replicaSet,选项,,“测试”);   ,public  static  synchronized  void  init (replicaSet, List   ,,,,,,,,,,,,,,,,,,,,,,,MongoClientOptions 选项,,String  defaultDb) {   ,,,,,,,,,,,,,,,mongo =, new  MongoClient (replicaSet,,选项);   ,,,,,,,,,,,,,,,mongo.setReadPreference (ReadPreference.nearest ());   ,,,,,,,,,,,,,,,setDb (mongo.getDB (defaultDb));   ,,,,,,,}

,,,,当初一眼看过去也是头大无比,就跟大学背下来的连接mysql数据库驱动一样,只求考试默写下来不挂科,虽然也能用,但是不求甚解的态度明显是错误的!接下来分解下来一步一步看吧:

,,,,

,,,,public  ServerAddress (, String  host ,, int  port )   ,,,,,,,throws  UnknownHostException  {   ,,,,,,,if  (==,, host  null )   ,,,,,,,,,,,host =, defaultHost ();   ,,,,,,,host =, host.trim ();   ,,,,,,,if  (, host.length (),==, 0,)   ,,,,,,,,,,,host =, defaultHost ();   ,,,,,,,   ,,,,,,,int  idx =, host.indexOf (,“:”,);   ,,,,,,,if (祝辞,idx  0,) {   ,,,,,,,,,,,if  (, port  !=, defaultPort (),)   ,,,,,,,,,,,,,,,throw  new  IllegalArgumentException(,“可以't  specify  port  construct 拷贝;以及via 主机”,);   ,,,,,,,,,,,port =, Integer.parseInt (, host.substring (+, idx  1,),);   ,,,,,,,,,,,host =, host.substring(0,的不同之处是,idx ) .trim ();   ,,,,,,,}      ,,,,,,,_host =,主机;   ,,,,,,,_port =,港口;   ,,,,,,,updateInetAddress ();   ,,,}

,,,, replicaSet显然是一个服务器地址数组,点进去后是对IP地址以及端口的解析。如果填写的地址是127.0.0.1:27017样式的话,冒号之后的端口必须是27017年,否则就抛出异常告诉你不能自己构建主机及端口,不过既然使用了带主机以及港口的构造方法,地址和端口分开写就好了,何必放在一块……

,,,,

boolean  updateInetAddress (), throws  UnknownHostException  {   ,,,,,,,InetSocketAddress  oldAddress =, _address;   ,,,,,,,_address =, new  InetSocketAddress (, InetAddress.getByName (_host),,, _port );   ,,,,,,,return  ! _address.equals (oldAddress);   ,,,}   ,,,,   volatile  InetSocketAddress  _address;

,,,,至于updateInetAddress (), InetAddress是java对ip地址的封装,方便其他网络类调用,方法内部对ipv4和ipv6有各种详细的判定,不多赘述,毕竟是基础类,有时间认真学习一下提升会非常大。详细内容在这个博客里面http://my.oschina.net/fhd/blog/371997有提及.volatile是一个类型修饰符(类型说明符)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入不稳定,要么无法编写多线程程序,要么编译器失去大量优化的机会。回到第一块,MongoClientOptions是对数据库的一些设置,用到了人民喜闻乐见的构建者模式建筑:

,,,

,,,,,,,,private  String 描述;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

java连接mongodb源码解读