设为首页 收藏本站
查看: 1359|回复: 0

[经验分享] java连接mongo

[复制链接]

尚未签到

发表于 2016-12-2 07:22:16 | 显示全部楼层 |阅读模式
  
一、连接方式:

1、单台服务器或主从模式:

 


  • Mongo mongo1 = new Mongo( "127.0.0.1" );

  • Mongo mongo2 = new Mongo( "127.0.0.1", 27017 );
  • Mongo mongo3 = new Mongo( new DBAddress( "127.0.0.1", 27017, "test" ) );
  • Mongo mongo4 = new Mongo( new ServerAddress( "127.0.0.1") );


  四种方式均可,默认的链接端口是27017。

2、复制集模式链接:请注意,单台机器上配置的复制集最好使用真实ip初始化和链接,不建议使用127.0.0.1或者localhost,否则容易链接不上,详见此篇blog


 


  • static Mongo m = null;
  • static{
  • try {
  • List<ServerAddress> list= new ArrayList<ServerAddress>();
  • ServerAddress sap0 = new ServerAddress("192.168.132.100",20011);
  • ServerAddress sas1 = new ServerAddress("192.168.132.100",20012);
  • ServerAddress sas2 = new ServerAddress("192.168.132.100",20013);
  • list.add(sap0);
  • list.add(sas1);
  • list.add(sas2);
  • m = new Mongo(list);
  • } catch (UnknownHostException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • }


  
二、连接选项:
mongo-java-driver中提供了一个类MongoOption,用于初始化链接参数,主要有一下这些:
1、常规选项:
①、connectionsPerHost:单个主机连接到mongo实例允许的最大连接数。这其实相当于c3p0的maxPoolSize参数,mongo是内建连接池的,功能跟c3p0等差不多,超过了就会新建链接,默认值是10,大并发的话较小。
②、threadsAllowedToBlockForConnectionMultiplier:这个参数是跟connectionsPerHost配套的,当连接数超过connectionsPerHost的时候,需要建立新的连接,连接请求会被阻塞,这个参数就代表允许阻塞请求的最大值,超过这个值之后的请求都会报错。默认值5。
③、maxWaitTime:线程等待链接可用的最长时间,ms单位,默认120,000,两分钟。
④、connectTimeout:建立链接的超时时间。默认为10,000,10s(2.9.0)
⑤、socketTimeout:执行io操作的超时时间,默认为0,代表不超时。
⑥、socketKeepAlive:为防火墙设置的,保证socket存活。默认false。
⑦、autoConnectRetry:自动重连,连接池都有的参数。但是在mongo里显的比较鸡肋,不管设置false还是true,mongo-java-driver本身就有重连机制,而且当是复制集的情况下,如果主库宕机,他只会重连宕机机器的ip,我不知道这个是怎么处理的,以后看源码吧,默认false,看来本来也不建议打开。
ps:(2012-09-28)今天机房发生网络波动,导致连接数暴增,应该跟自动重连是有关系的,mongo的访问量较大,在网络波动的情况下极易放生这种情况,看来这个自动重连也需要改进。
⑧、maxAutoConnectRetryTime:我去,坑爹啊,竟然是时间!默认为0,代表15s。。。咋想的。
⑨、slaveOk:用于读写分离,废弃了(mongo2.0/driver2.7),详见Mongo读写分离。
使用:
2、特殊选项:
Driver对数据库的写操作分几个安全级别,均是通过WriteConcern类控制,在MongoOption中定义了WriteConcern中使用的全局参数。
①、WriteConcern中的几个安全级别:
 


  • /** No exceptions are raised, even for network issues */

  •     public final static WriteConcern NONE = new WriteConcern(-1);

  •     /** Exceptions are raised for network issues, but not server errors */
  •     public final static WriteConcern NORMAL = new WriteConcern(0);

  •     /** Exceptions are raised for network issues, and server errors; waits on a server for the write operation */
  •     public final static WriteConcern SAFE = new WriteConcern(1);

  •     /** Exceptions are raised for network issues, and server errors; waits on a majority of servers for the write operation ,waits for more than 50% of the configured nodes to acknowledge the write (until replication is applied to the point of that write)
    */
  •     public final static WriteConcern MAJORITY = new Majority();

  •     /** Exceptions are raised for network issues, and server errors; the write operation waits for the server to flush the data to disk*/
  •     public final static WriteConcern FSYNC_SAFE = new WriteConcern(true);

  •     /** Exceptions are raised for network issues, and server errors; the write operation waits for the server to group commit to the journal file on disk*/
  •     public final static WriteConcern JOURNAL_SAFE = new WriteConcern( 1, 0, false, true );

  •     /** Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation*/
  •     public final static WriteConcern REPLICAS_SAFE = new WriteConcern(2);


NONE的级别最低,不管出了啥事儿,客户端一股脑的往mongo插入,连网络断了都不管。REPLICAS_SAFE的级别最高,他要等从库都同步完才返回给客户端插入成功,复制集的话要至少两台同步完才行,分布式事务啊,牛叉,但是,它没有事务。。。开玩喜了。
②、参数解释:
WriteConcern的初始化函数,一通重载之后调用:
 


  • public WriteConcern( int w , int wtimeout , boolean fsync , boolean j, boolean continueOnInsertError){

  •         _w = w;
  •         _wtimeout = wtimeout;
  •         _fsync = fsync;
  •         _j = j;
  •         _continueOnErrorForInsert = continueOnInsertError;
  •     }


这个函数指定写操作需要等待的server的数量和抛出异常的行为。
w:代表server的数量:。
w=-1 不等待,不做异常检查
w=0 不等待,只返回网络错误
w=1 检查本机,并检查网络错误
w>1 检查w个server,并返回网络错误
wtimeout:写操作超时的时间。
fsync :是不是等待刷新数据到磁盘,参见FSYNC_SAFE的注释。
j:是不是等待提交的数据已经写入到日志,并刷新到磁盘,参见JOURNAL_SAFE的注释。
MongoOption中有全局的设置。还有一个
safe
:相当于w=1,wtimeout=0,fsync和j为false,如果这几个指定了,safe不起作用。参见SAFE的注释

三、MongoOption的使用:
 


  • MongoOptions op = new MongoOptions();

  • op.safe=true;
  • op.connctionPerHost=50;
  • op.connctionTimeout=120000;
  • ....
  • //list是serverAddress的列表
  • Mongo m = new Mongo(list,op);


WriteConcern设置好之后用

 


  • m.setWriteConcern(wc);



调用

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308321-1-1.html 上篇帖子: php 操作mongo 下篇帖子: mongo相关工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表