一个简单的循环:
(0..1000).each{
db.testTable.insert([name:"aaa"+it])
}
上面的测试在局域网是正常的。但如果连接互联网的数据库(网络环境稍差),程序插入了1000条,但你会发现数据库里只有900多条。其原因,我猜测只能是mongodb接受的数据太快了(因为网络延迟,可能突然来一个大数据包),超出了mongo的处理能力,它就直接把超出它队列的数据丢掉了。这个bug真是太坑人了。
为什么说不是网络丢包呢?因为在客户端和mongo服务端都没有报错,所以肯定不是tcp包丢失的问题。mongod在应用层应该是收到了所有的包了。但是它不能处理的话,难道不能丢个错出来?而要默默地把数据扔掉?
此问题在使用语句得到解决,此语句是:
mongo.setWriteConcern(WriteConcern.SAFE)
也就是用同步写来解决问题。原先默认的是异步写。
使用mongodb的朋友,上述问题要切记。另,我测试的版本是2.2.2