深入MongoDB连接池

随着应用程序的规模增大、功能增多,更好的管理资源显得尤为重要。对于大部分开发者而言,不合理的利用连接池是造成MongoDB性能问题的罪魁祸首。

连接池

新创建一个数据库连接的代价是非常昂贵的。因此不要为每个请求都创建一个新的连接然后销毁,而应当尽可能的复用现有的连接。这就是连接池的由来。

连接池顾名思义就是数据库连接的缓存,因此当需要有新的连接建立时可以复用现有的连接。如果使用恰当的话,连接池可以最大限度的降低数据库的新连接数目和创建频率。

Opening too many connections

Getting connection refused because too many open connections: 819

Default: depends on system (i.e. ulimit and file descriptor) limits. Unless set, MongoDB will not limit its own connections. You cannot set maxConns to a value higher than 20000.

MongoDB有一个名为maxConns的属性,可以用来设置最大连接数。默认情况下,maxConns的值为连接可用文件描述符数目的80%,因此Mac上默认值为204(Mac OS X下每个进程可用文件描述符默认值是256),CentOS下默认值为819(1024 * 0.8)。

ulimit -n

You open do MongoClient.connect once when your app boots up and reuse the db object. It’s not a singleton connection pool each .connect creates a new connection pool. [4]

如何查看当前的连接数?

> db.serverStatus().connections
> { "current" : 71, "available" : 748 }

mongostat

mongostat是mongdb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态并输出。当发现数据库突然变慢或者其它异常情况时,mongostat可以帮助我们快速的定位问题。

参考链接