欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

百度BAE Mongodb长连接实现_解决BAE Mongodb连接不上或断开的问题

程序员文章站 2021-12-28 21:38:45
...

就最近几天发现博客访问非常慢、因为我有使用mysql和mongodb配合使用的、昨天发现了一个问题、当我使用mongodb的时候网站响应非常慢、但如果是直接mysql的响应就会非常快、然后就提交一下工单、最后百度的技术给我的答复是这样的、如下


尊敬的用户、您好!

另外、我们想跟您说:我们看slowlog里关于mongo的建立mongo connection的时候比较慢、 您是否每个请求都会新开connection并关闭?

如果网站访问量比较大的话、建议您参考如下方式优化代码以节约建立mongo connection的开销、因为我们最近把mongo不活跃时间的保持时间从30秒延长到了1小时、这样的方式可以大大减少开启新connection的次数


<?php

doSomething();//这次getMongoDB()会新建一个连接
sleep(5);
doSomething();//这次getMongoDB()会复用旧的连接
echo "after a long long time"; // 假设过了很久的时间都没有mongo访问 服务器端已将该连接关闭
doSomething();//这次getMongoDB()在尝试复用旧的连接发现已失效然后再新建一个连接


function doSomething() {
    $mongoDB = getMongoDB();
    $mongoCollection = $mongoDB->selectCollection('test');
    $mongoCursor = $mongoCollection->find();
    while($mongoCursor->hasNext()) {
        print_r($mongoCursor->getNext());
    }
}

//如果没有可用的connection将会新建一个
//如果有可用的connection将会尝试直接复用旧的
//但如果旧的因为长期不活跃已被server端关闭的话,会再重新连接
//这样可以减少不断创建新连接的开销
function getMongoDB() {
    $host = 'mongo.duapp.com';
    $port = '8908';
    $dbname = "IlnGRKRfquQNXCgdwTOl";
    $user = "2b7ef0f091df48e3a40a33323f4024c7";
    $pwd = "5d2e19e26a1b41ee8ab2b92eac0ec37e";

    $retry = 3;
    do {
        try {
            $mongoClient = new MongoClient("mongodb://{$user}:{$pwd}@{$host}:{$port}/{$dbname}");
            return $mongoClient->selectDB($dbname);
        } catch (Exception $e) {
            $retry--;
        }
    } while($retry > 0);
}

?>


那么额外之意就是、以后我们在使用BAE的mongodb的时候、就不用再每次都关闭连接了、之前是因为只有30秒、如果不关闭下一次会连接不上的、然而现在、百度BAE最近把mongo不活跃时间的保持时间从30秒延长到了1小时、这样的方式可以大大减少开启新connection的次数

用这种方式改了之后、发现程序的响应速度是有所提升的、就算一个小时过去了、连接被关闭、那么慢也只会慢一次、其实已经实现了一个短暂的长连接、希望我的分享会对大家有帮助


好了、这样就可以实现在应用里面选择联系人并发送短信了、切记要添加权限不然会出错的