当前位置:首页 »“秋了秋”个人博客 » 后端技术 » 解决mongodb报write EPIPE错误

解决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

epipeerror.jpg

解决办法就是不要手动close数据库,保持数据库长连接,避免异步多线程错综复杂的副作用。解决问题思路来源于

What is ePipe error?


如果按照上面的做法很容易导致数据库连接池满了崩溃。


如何解决数据库不close之后不断有连接进来,导致连接池爆满出现数据库关闭的问题,可以设置一个时间段之后再close,如果在这个时间段内又有新的连接进来,则取消上一次close的执行命令。如图

closedb.jpg


终极措施:一个服务有多少个数据库就只需要多少个connection,并且是个常量,只要连接上就保持长连接,而不是每个请求创建一个connection。服务器对mongodb的连接数有限制,阿里云普通服务器只有800多个连接数,满了则会崩溃。

0
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/244.html
目录: 后端技术标签: mongodb,数据库 2880次阅读

请求播放音乐,请点击播放

登 录
点击获取验证码
还没账号?点击这里