解决mongodb报write EPIPE错误
作者:秋了秋 发表时间:2022年07月30日
如题,如果在控制台看日志发现mongodb报{"name":"MongoError","message":"write EPIPE"}错误,想要解决,但是又复现不了场景怎么处置?那就只能从原理上剖析。
从报错上来看就是写入数据出错,与之相呼应的还有读取错误TypeError: Cannot read property 'collection' of null,为什么读写失败,mongodb数据库有问题?mongodb数据库没有启动?mongodb被closed了?很明显前两者都不是,因为部分成功部分失败,最有可能就是第三种被程序关闭连接通道了。
一般都是由于程序员良好的编程习惯导致,比如来了一个请求连接数据库,1.连接数据库,2.获取数据,3.返回数据,4.关闭连接,一气呵成,貌似没有任何毛病,但是当多个请求并行来了,多个请求同时连接数据库,每个请求的获取数据时间不一致,就会导致,a连接已经走完了整个流程并close数据库了,而b连接还在获取数据,此时数据库被关闭了,所以就会导致报错{"name":"MongoError","message":"write EPIPE"}或者TypeError: Cannot read property 'collection' of null
解决办法就是不要手动close数据库,保持数据库长连接,避免异步多线程错综复杂的副作用。解决问题思路来源于
如果按照上面的做法很容易导致数据库连接池满了崩溃。
如何解决数据库不close之后不断有连接进来,导致连接池爆满出现数据库关闭的问题,可以设置一个时间段之后再close,如果在这个时间段内又有新的连接进来,则取消上一次close的执行命令。如图
终极措施:一个服务有多少个数据库就只需要多少个connection,并且是个常量,只要连接上就保持长连接,而不是每个请求创建一个connection。服务器对mongodb的连接数有限制,阿里云普通服务器只有800多个连接数,满了则会崩溃。