通过mongodb客户端samus代码研究解决问题

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 17:26 点击:

 

  最近有项目需要用到mongodb,于是在网上下载了mongodb的源码,根据示例写了测试代码,但发现一个非常奇怪的问题:插入记录的速度比获取数据的速度还要快,而且最重要的问题是获取数据的速度无法让人接受。

  

     测试场景:主文档存储人员基本信息,子文档一存储学生上课合同数据集合,这个集合多的可达到几百,子文档二存储合同的付款记录集合,集合大小一般不会超过50。根据人员ID查询人员文档,序列化后的大小为180K不到,但消耗的时间在400ms以上。

  

    我的主要问题在于不能接收获取一个180K的记录需要400ms以上,这比起传统的RDBMS都没有优势,而且mongodb也是内存映射机制,没道理性能如此之差,而且网络上关于它的性能测试数据远远好于我的测试结果。

  

    排除方式一:是不是因为有子文档的原因?

    找一个没有任何合同记录的文档查询,发现结果依旧,没有明显的改善;

  

    排除方式二:没有创建索引?

    在搜索列ID上创建索引,结果依旧;

  

   排除方式三:是不是文档数量过大?

   一万多行只是小数目,没理由,mongodb管理上千万的文档都是没有问题的,于时还是决定试一试,将记录全部删除,插入一条记录然后查询,结果依旧;

  

   排除方式四:是不是由于客户端序列化的问题?

   由于我存储的是自定义的对象,不是默认的Document,所以决定尝试直接存储Document,Document就两个字段,获取速度还是需要180ms。

  

   排除方式五:是否由于客户机器是32位,而mongodb服务是64?

   将程序放在64位机器上测试,问题依旧。

  

   排除方式六:是否由于网络传输问题?

   没道理啊,测试的客户端以及服务端均在同一局域网,但还是尝试将客户端程序直接在mongodb服务器上执行,问题一样;

  

   上面的六种方式都已经尝试过,没有解决,最后决定求助于老代,毕竟是用过mongodb的高人,给我两个建议就搞定了:

  

   排除方式七:查看mongodb数据文件,看是否已经很大?

   经查看,总大小才64M,这比32位文件上限的2G来讲,可以基本忽略;

  

   排除方式八:连接字符串。

   Servers=IP:27017;ConnectTimeout=30000;ConnectionLifetime=300000;MinimumPoolSize=8;MaximumPoolSize=256;Pooled=true

 

 

   我一看到这个参考字符串,第一印象是,我的写法和它不一样(string connectionString = "mongodb://localhost"; ),然后发现有两个重要的参数:

   1:ConnectionLifetime=300000,从字面意思来看,是说连接的生命周期,而它的数值设置如此大,显然说明此连接不会被立即关闭,这和sql server的做法有所区别;

   2:Pooled=true,从字面意思来看,应该是有连接池的概念。

 

 

   分析:从上面的连接参数来看,我之前所理解的连接,就是客户端与服务端之间的连接,它需要在使用完之后马上关闭,即客户端与服务端不在有tcp连接。但我没有很好的理解连接池的作用。连接池实际上从存储很多个已经和服务端建立tcp连接的connection,在它的生命周期内一直保持和服务端的连接,生命周期过后会变成失效连接等待回收。

  

   重新修改连接字符串再进行测试,问题解决,只有第一次请求时,由于需要创建tcp连接,性能会受影响,后面的请求,因为有连接池的存在,性能得到成倍提高。

  

   最后看了下samus源码,就可以看出它是如何使用连接池的。

  

   先看下我写的一个mongodb的帮助类:里面有创建Mongo对象等常规操作。

 

public class MongodbFactory2<T>: IDisposable where T : class

    {

        //public  string connectionString = "mongodb://10.1.55.172";

        public  string connectionString = ConfigurationManager.AppSettings["mongodb"];

        public  string database

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • 浅析.NET下XML数据访问新机制
      • asp.net 面试+笔试题目第1/2页
      • C# 邮件地址是否合法的验证
      • C#高级编程:数据库连接[1]
      • asp.net 设置GridView的选中行的实现代码
      • 经典C++程序1
      • IIS 自动回收导致后台定时器失效的问题解决
      • ASP.NET&#160;GridView列表代码示例
      • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1