您的位置:首页 > 数据库 > Mongodb

php + mongodb 百万级记录批量remove异常问题

2013-09-03 13:32 162 查看
1. 大批量insert,update,remove中可能会因为操作超时而发生异常
在对php+mongodb进行性能测的过程中发现一个问题,mongodb的insert,update,remove等函数有一个默认的30秒超时问题如:$coll->remove();试图使用上面的语句清空coll中的所以记录是,你会发现若果在上面语句的后面加一句:$count = $coll->count();用来测试remove返回时是不是真已经删空了后面这条语句就会触发一个30秒超时的异常,经过研究我发现其实是remove操作超过了30秒,在remove中30秒都还没收到数据库的回应信息,remove将返回(但其实remove这条指令已经下发给数据库,因此删除操作还继续执行)返回后接着执行$count = $coll->count();,但是这里就有问题了,因为这时候remove删除操作没没结束,貌似remove语句给数据库上锁了,$count = $coll->count();执行的时候由于remove操作还没完成,也就是还没解锁,就等呀等呀,30秒超时后抛出异常,终止。remove原型:public bool|array MongoCollection::remove ([ array
$criteria
=
array() [, array
$options
=
array() ]] )
这里不知道是我理解的不对还是怎么的,感觉有些坑爹,注意它的参数[
$criteria
[
$options
]],
$options
是在[[]]内,我理解的是:
如果没有
$criteria就不应该设置$options,我测试了一下也是这样的,若果我理解错误了,还望读到次文的同志帮忙提出来,谢谢。
基于上面的理解,我们就不能使用如$coll->remove(array("safe"=>true));这样的方法来清空table(我也测过,确实不行),也就是要设置[code]$criteria,但是我们的目的就是清空,若果在做匹配然后再清空我觉得应该会降低这个清空操作的性能,但没办法呀,所以只能是:
#$re_db
= $coll->remove(array("app.type"=>"game"),array("safe" => true));
[/code]
但是还不够,这样还是没解决问题,需要再为remove设置一个timeout的时间:
$re_db
= $coll->remove(array("app.type"=>"game"),array("safe" => true,"timeout"=>6000000));
上面的超时设为600秒(timeout单位是毫秒),这样只要你的remove操作能在600秒内完成,就能实现这样的功能:等待remove执行完成后再执行$count = $coll->count();notice:这里的$re_db不能省略2.中断及误操作带来的苦恼
在测试中发现一个郁闷的现象,比如php中有对db执行很大数量的删除或插入操作时,页面卡死在那,等的不赖烦关掉,或者发现操作错误,关掉页面想对数据库进行其他操作,但是若php已经向mongodb发送了remove、insert等指令,并正在执行,那么php页面关闭后,发送给mongo的指令并不会被终止掉,然后就会发现,页面关闭后,还在不停的往数据库中插入、删除数据,这时你就不好再对数据库进行操作,因为前面的操作还没完成,然后就要等呀等呀,对于这个问题目前还没找到解决方法:
关闭php页面后终止php对mongodb的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: