使用pymongo保持连续的mongo连接活动

时间:2015-10-12 20:45:26

标签: python mongodb garbage-collection database-connection pymongo

我有来自kafka的消费者阅读,其中包含连续的事件流,我经常要写一个mongo集合,我必须打开一个连续的mongo连接。我的解决方案是相当hacky我觉得是每5分钟左右重新初始化一次连接以避免网络超时。这是为了避免kafka没有事件且连接空闲的时段。

有人能建议更好的方法吗?因为我很确定这是建立与mongo的连续连接的错误方法。

我正在使用pymongo客户端。

我有一个MongoAdapter类,它有辅助方法:

    from pymongo import MongoClient
    import pymongo
    import time

    class MongoAdapter:
        def __init__(self,databaseName,userid,password,host):
            self.databaseName=databaseName
            self.userid=userid
            self.password=password
            self.host=host
            self.connection=MongoClient(host=self.host,maxPoolSize=100,socketTimeoutMS=1000,connectTimeoutMS=1000)
            self.getDatabase()
        def getDatabase(self):
            try:
                if(self.connection[self.databaseName].authenticate(self.userid,self.password)):
                print "authenticated true"
                self.database=self.connection[self.databaseName]
            except pymongo.errors.OperationFailure:
                print "Error: Please check Database Name, UserId,Password"

我按以下方式使用该类重新连接:

   adapter_reinit_threshold=300   #every 300 seconds, instantiate new mongo conn.
   adapter_config_time=time.time()
   while True
       if (time.time()-adapter_config_time) > adapter_reinit_threshold:
            adapter=MongoAdapter(config.db_name,config.db_user,config.db_password,config.db_host)   #re-connect
            adapter_config_time=time.time()   #update adapter_config_time

我继续这样做的原因是因为我认为旧的未使用的对象(具有开放连接,将被垃圾收集并且连接关闭)。虽然这种方法运行正常,但我想知道是否有更简洁的方法可以做到这一点,以及这种方法的缺陷是什么。

1 个答案:

答案 0 :(得分:0)

来自pymongo.mongo_client.MongoClient

的文档
  

如果操作因网络错误而失败,则ConnectionFailure为   提出并且客户端在后台重新连接。应用代码   应该处理这个异常(认识到操作失败)   然后继续执行。

我认为您不需要实施自己的重新连接方法。